Merge with f8788d4ddcfd403481f7a33a1a37060666d07493 V00.03
authorymh <ymh.work@gmail.com>
Thu, 10 Jun 2010 19:19:13 +0200
changeset 22 562c33513553
parent 21 a39204d50541 (diff)
parent 20 f8788d4ddcfd (current diff)
child 23 1c0e262c4ab5
Merge with f8788d4ddcfd403481f7a33a1a37060666d07493
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,9 @@
+
+syntax: regexp
+^sbin/virtualenv/project-boot\.py$
+^sbin/virtualenv/env
+^web/\.htaccess$
+^web/eulalie/\.htaccess$
+^web/eulalie/config\.py$
+^web/static/media/
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgtags	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,4 @@
+65e914ac91c87678892bb29cbdfa39ace3aa3183 V00.01
+b3692a42ac798d6752d8efeb5eeb7ded0f4de295 V00.02
+b3692a42ac798d6752d8efeb5eeb7ded0f4de295 V00.02
+d992dc4ad83fee96e0194af4cbf90910e56460c3 V00.02
--- a/.pydevproject	Thu Jun 10 19:15:21 2010 +0200
+++ b/.pydevproject	Thu Jun 10 19:19:13 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_eulalie</pydev_property>
 <pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.6</pydev_property>
 </pydev_project>
--- a/sbin/sync/sync_ldt_platform	Thu Jun 10 19:15:21 2010 +0200
+++ b/sbin/sync/sync_ldt_platform	Thu Jun 10 19:19:13 2010 +0200
@@ -1,20 +1,20 @@
 #!/usr/bin/env bash
 set -e
-if [ -d ~/tmp/blinkster_V$1 ]; then
-    rm -fr ~/tmp/blinkster_V$1;
+if [ -d ~/tmp/eulalie_V$1 ]; then
+    rm -fr ~/tmp/eulalie_V$1;
 fi
 
-hg archive -r V$1 ~/tmp/blinkster_V$1
+hg archive -r V$1 ~/tmp/eulalie_V$1
 
-#text2unix ~/tmp/blinkster_V$1
+#text2unix ~/tmp/eulalie_V$1
 
-if [ -d ~/tmp/blinkster_V$1 ]; then
-    cat <<EOT | rsync -Cvrlz --delete --filter=". -" ~/tmp/blinkster_V$1/web/ web.iri.centrepompidou.fr:/iridata/www/web/blinkster/
+if [ -d ~/tmp/eulalie_V$1 ]; then
+    cat <<EOT | rsync -Cvrlz --delete --filter=". -" ~/tmp/eulalie_V$1/web/ web.iri.centrepompidou.fr:/iridata/www/web/eulalie/
 + core
 P .htpasswd
 P .htaccess
-P blinkster/.htaccess
-P blinkster/config.py
+P eulalie/.htaccess
+P eulalie/config.py
 P robots.txt
 P env/***
 P log/***
@@ -23,9 +23,9 @@
 EOT
 fi
 
-if [ -d ~/tmp/blinkster_V$1 ]; then
+if [ -d ~/tmp/eulalie_V$1 ]; then
     echo "Deleting temp export"
-    rm -fr ~/tmp/blinkster_V$1;
+    rm -fr ~/tmp/eulalie_V$1;
 fi
 
 ssh web.iri.centrepompidou.fr sudo apache2ctl restart
--- a/sbin/sync/sync_ldt_platform_venv	Thu Jun 10 19:15:21 2010 +0200
+++ b/sbin/sync/sync_ldt_platform_venv	Thu Jun 10 19:19:13 2010 +0200
@@ -1,20 +1,20 @@
 #!/usr/bin/env bash
 set -e
-if [ -d ~/tmp/blinkster_V$1 ]; then
-    rm -fr ~/tmp/blinkster_V$1;
+if [ -d ~/tmp/eulalie_V$1 ]; then
+    rm -fr ~/tmp/eulalie_V$1;
 fi
 
-hg archive -r V$1 ~/tmp/blinkster_V$1
+hg archive -r V$1 ~/tmp/eulalie_V$1
 
-#text2unix ~/tmp/blinkster_V$1
+#text2unix ~/tmp/eulalie_V$1
 
-if [ -d ~/tmp/blinkster_V$1 ]; then
-    cat <<EOT | rsync -Cvrlz --delete --filter=". -" ~/tmp/blinkster_V$1/sbin/ web.iri.centrepompidou.fr:project/blinkster/sbin
+if [ -d ~/tmp/eulalie_V$1 ]; then
+    cat <<EOT | rsync -Cvrlz --delete --filter=". -" ~/tmp/eulalie_V$1/sbin/ web.iri.centrepompidou.fr:projects/eulalie/sbin
 + core
 EOT
 fi
 
-if [ -d ~/tmp/blinkster_V$1 ]; then
+if [ -d ~/tmp/eulalie_V$1 ]; then
     echo "Deleting temp export"
-    rm -fr ~/tmp/blinkster_V$1;
+    rm -fr ~/tmp/eulalie_V$1;
 fi
--- a/sbin/virtualenv/create_python_env.py	Thu Jun 10 19:15:21 2010 +0200
+++ b/sbin/virtualenv/create_python_env.py	Thu Jun 10 19:19:13 2010 +0200
@@ -8,8 +8,9 @@
 - distribute
 - psycopg2 requires the PostgreSQL libpq libraries and the pg_config utility
 
-- virtualenv --distribute --no-site-packages venv
-- python project-boot.py --distribute --no-site-packages --index-url=http://pypi.websushi.org/ --clear bvenv
+- python project-boot.py --distribute --no-site-packages --index-url=http://pypi.websushi.org/ --clear --type-install=local <path_to_venv>
+- For Linux :
+python project-boot.py --unzip-setuptools --no-site-packages --index-url=http://pypi.websushi.org/ --clear --type-install=local <path_to_venv>
 
 """
 
@@ -45,7 +46,6 @@
 EXTRA_TEXT += "    'PYLUCENE' : { 'setup': 'http://apache.crihan.fr/dist/lucene/pylucene/pylucene-3.0.1-1-src.tar.gz', 'url': 'http://apache.crihan.fr/dist/lucene/pylucene/pylucene-3.0.1-1-src.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"pylucene-3.0.1-1-src.tar.gz"))+"'},\n"
 EXTRA_TEXT += "    'PIL' : { 'setup': 'pil', 'url': 'http://effbot.org/downloads/Imaging-1.1.7.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"Imaging-1.1.7.tar.gz"))+"'},\n"
 EXTRA_TEXT += "    'PYXML' : { 'setup': 'http://sourceforge.net/projects/pyxml/files/pyxml/0.8.4/PyXML-0.8.4.tar.gz/download', 'url': 'http://sourceforge.net/projects/pyxml/files/pyxml/0.8.4/PyXML-0.8.4.tar.gz/download', 'local': '"+ os.path.abspath(os.path.join(src_base,"PyXML-0.8.4.tar.gz"))+"', 'patch': '"+os.path.join(patch_path,"pyxml.patch")+"'},\n"
-EXTRA_TEXT += "    'JSON' : { 'setup': 'simplejson', 'url': 'http://pypi.python.org/packages/source/s/simplejson/simplejson-2.1.1.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"simplejson-2.1.1.tar.gz"))+"'},\n"
 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"
@@ -79,6 +79,13 @@
         dest='type_install',
         default='local',
         help='type install : local, url, setup')
+    parser.add_option(
+        '--ignore-packages',
+        metavar='ignore_packages',
+        dest='ignore_packages',
+        default=None,
+        help='list of comma separated keys for package to ignore')
+
 
 
 def adjust_options(options, args):
@@ -96,117 +103,126 @@
     
     res_source_key = options.type_install
     
+    ignore_packages = []
+    
+    if options.ignore_packages :
+        ignore_packages = options.ignore_packages.split(",")
+    
     logger.indent += 2
     try:
         
-        #get pylucene
-        logger.notify("Get Pylucene from %s " % URLS['PYLUCENE'][res_source_key])
-        pylucene_src = os.path.join(src_dir,"pylucene.tar.gz")
-        urllib.urlretrieve(URLS['PYLUCENE'][res_source_key], pylucene_src)
-        tf = tarfile.open(pylucene_src,'r:gz')
-        pylucene_base_path = os.path.join(src_dir,"pylucene") 
-        logger.notify("Extract Pylucene to %s " % pylucene_base_path)
-        tf.extractall(pylucene_base_path)
-        tf.close()
-        
-        pylucene_src_path = os.path.join(pylucene_base_path, os.listdir(pylucene_base_path)[0])
-        jcc_src_path = os.path.abspath(os.path.join(pylucene_src_path,"jcc"))
-        
-        #install jcc
+        if 'PYLUCENE' not in ignore_packages:
+            #get pylucene
+            logger.notify("Get Pylucene from %s " % URLS['PYLUCENE'][res_source_key])
+            pylucene_src = os.path.join(src_dir,"pylucene.tar.gz")
+            urllib.urlretrieve(URLS['PYLUCENE'][res_source_key], pylucene_src)
+            tf = tarfile.open(pylucene_src,'r:gz')
+            pylucene_base_path = os.path.join(src_dir,"pylucene") 
+            logger.notify("Extract Pylucene to %s " % pylucene_base_path)
+            tf.extractall(pylucene_base_path)
+            tf.close()
+            
+            pylucene_src_path = os.path.join(pylucene_base_path, os.listdir(pylucene_base_path)[0])
+            jcc_src_path = os.path.abspath(os.path.join(pylucene_src_path,"jcc"))
+            
+            #install jcc
+    
+            #patch for linux
+            if system_str == 'Linux' :
+                olddir = os.getcwd()
+                patch_dest_path = os.path.join(lib_dir,'site-packages','setuptools-0.6c11-py'+'%s.%s' % (sys.version_info[0], sys.version_info[1])+'.egg')
+                logger.notify("Patch jcc : %s " % (patch_dest_path))
+                os.chdir(patch_dest_path)
+                p = patch.fromfile(os.path.join(jcc_src_path,"jcc","patches","patch.43.0.6c11"))
+                p.apply()
+                os.chdir(olddir)
+    
+            logger.notify("Install jcc")
+            call_subprocess([os.path.abspath(os.path.join(home_dir, 'bin', 'python')), 'setup.py', 'install'],
+                            cwd=jcc_src_path,
+                            filter_stdout=filter_python_develop,
+                            show_stdout=True)
+            #install pylucene
+            
+            logger.notify("Install pylucene")
+            #modify makefile
+            makefile_path = os.path.join(pylucene_src_path,"Makefile")
+            logger.notify("Modify makefile %s " % makefile_path)
+            shutil.move( makefile_path, makefile_path+"~" )
+    
+            destination= open( makefile_path, "w" )
+            source= open( makefile_path+"~", "r" )
+            destination.write("PREFIX_PYTHON="+os.path.abspath(home_dir)+"\\n")
+            destination.write("ANT=ant\\n")
+            destination.write("PYTHON=$(PREFIX_PYTHON)/bin/python\\n")
+            
+            if system_str == "Darwin":
+                if sys.version_info >= (2,6):
+                    destination.write("JCC=$(PYTHON) -m jcc.__main__ --shared --arch x86_64 --arch i386\\n")
+                else:
+                    destination.write("JCC=$(PYTHON) -m jcc --shared --arch x86_64 --arch i386\\n")
+                destination.write("NUM_FILES=2\\n")
+            elif system_str == "Windows":
+                destination.write("JCC=$(PYTHON) -m jcc.__main__ --shared --arch x86_64 --arch i386\\n")
+                destination.write("NUM_FILES=2\\n")
+            else:
+                destination.write("JCC=$(PYTHON) -m jcc --shared\\n")
+                destination.write("NUM_FILES=2\\n")
+            for line in source:
+                destination.write( line )
+            source.close()
+            destination.close()
+            os.remove(makefile_path+"~" )
+    
+            logger.notify("pylucene make")
+            call_subprocess(['make'],
+                            cwd=os.path.abspath(pylucene_src_path),
+                            filter_stdout=filter_python_develop,
+                            show_stdout=True)
+    
+            logger.notify("pylucene make install")
+            call_subprocess(['make', 'install'],
+                            cwd=os.path.abspath(pylucene_src_path),
+                            filter_stdout=filter_python_develop,
+                            show_stdout=True)
 
-        #patch for linux
-        if system_str == 'Linux' :
-            olddir = os.getcwd()
-            patch_dest_path = os.path.join(lib_dir,'site-packages','setuptools-0.6c11-py'+'%s.%s' % (sys.version_info[0], sys.version_info[1])+'.egg')
-            logger.notify("Patch jcc : %s " % (patch_dest_path))
-            os.chdir(patch_dest_path)
-            p = patch.fromfile(os.path.join(jcc_src_path,"jcc","patches","patch.43.0.6c11"))
-            p.apply()
-            os.chdir(olddir)
+        if system_str == 'Linux'  and 'DISTRIBUTE' not in ignore_packages:
+            normal_install('DISTRIBUTE', 'pip', None, res_source_key, home_dir, tmp_dir)
 
-        logger.notify("Install jcc")
-        call_subprocess([os.path.abspath(os.path.join(home_dir, 'bin', 'python')), 'setup.py', 'install'],
-                        cwd=jcc_src_path,
+        if 'PYXML' not in ignore_packages:
+            logger.notify("PyXML install : %s " % URLS['PYXML'][res_source_key])
+            if sys.version_info >= (2,6):
+                logger.notify("PyXML -> python version >= 2.6 : patching")
+                pyxml_src = os.path.join(src_dir,"pyxml.tar.gz")
+                urllib.urlretrieve(URLS['PYXML'][res_source_key], pyxml_src)
+                logger.notify("PyXML -> python version >= 2.6 : extract archive")
+                tf = tarfile.open(pyxml_src,'r:gz')
+                pyxml_base_path = os.path.join(src_dir,"pyxml") 
+                tf.extractall(pyxml_base_path)
+                tf.close()
+    
+                #patch
+                pyxml_version = os.listdir(pyxml_base_path)[0]            
+                pyxml_path = os.path.join(pyxml_base_path, pyxml_version)
+                olddir = os.getcwd()
+                os.chdir(pyxml_path)
+                logger.notify("PyXML -> python version >= 2.6 : do patch %s : %s " % (pyxml_path, URLS['PYXML']['patch']))
+                p = patch.fromfile(URLS['PYXML']['patch'])
+                p.apply()
+                os.chdir(olddir)
+                logger.notify("PyXML -> python version >= 2.6 : install")
+                call_subprocess([os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-E', os.path.abspath(home_dir), '--build='+os.path.abspath(pyxml_base_path), '--no-download', pyxml_version],
+                        cwd=os.path.abspath(tmp_dir),
                         filter_stdout=filter_python_develop,
                         show_stdout=True)
-        #install pylucene
-        
-        logger.notify("Install pylucene")
-        #modify makefile
-        makefile_path = os.path.join(pylucene_src_path,"Makefile")
-        logger.notify("Modify makefile %s " % makefile_path)
-        shutil.move( makefile_path, makefile_path+"~" )
-
-        destination= open( makefile_path, "w" )
-        source= open( makefile_path+"~", "r" )
-        destination.write("PREFIX_PYTHON="+os.path.abspath(home_dir)+"\\n")
-        destination.write("ANT=ant\\n")
-        destination.write("PYTHON=$(PREFIX_PYTHON)/bin/python\\n")
-        
-        if system_str == "Darwin":
-            if sys.version_info >= (2,6):
-                destination.write("JCC=$(PYTHON) -m jcc.__main__ --shared --arch x86_64 --arch i386\\n")
             else:
-                destination.write("JCC=$(PYTHON) -m jcc --shared --arch x86_64 --arch i386\\n")
-            destination.write("NUM_FILES=2\\n")
-        elif system_str == "Windows":
-            destination.write("JCC=$(PYTHON) -m jcc.__main__ --shared --arch x86_64 --arch i386\\n")
-            destination.write("NUM_FILES=2\\n")
-        else:
-            destination.write("JCC=$(PYTHON) -m jcc --shared\\n")
-            destination.write("NUM_FILES=2\\n")
-        for line in source:
-            destination.write( line )
-        source.close()
-        destination.close()
-        os.remove(makefile_path+"~" )
-
-        logger.notify("pylucene make")
-        call_subprocess(['make'],
-                        cwd=os.path.abspath(pylucene_src_path),
+                call_subprocess([os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-E', os.path.abspath(home_dir), URLS['PYXML'][res_source_key]],
+                        cwd=os.path.abspath(tmp_dir),
                         filter_stdout=filter_python_develop,
                         show_stdout=True)
-
-        logger.notify("pylucene make install")
-        call_subprocess(['make', 'install'],
-                        cwd=os.path.abspath(pylucene_src_path),
-                        filter_stdout=filter_python_develop,
-                        show_stdout=True)
-
-        logger.notify("PyXML install : %s " % URLS['PYXML'][res_source_key])
-        if sys.version_info >= (2,6):
-            logger.notify("PyXML -> python version >= 2.6 : patching")
-            pyxml_src = os.path.join(src_dir,"pyxml.tar.gz")
-            urllib.urlretrieve(URLS['PYXML'][res_source_key], pyxml_src)
-            logger.notify("PyXML -> python version >= 2.6 : extract archive")
-            tf = tarfile.open(pyxml_src,'r:gz')
-            pyxml_base_path = os.path.join(src_dir,"pyxml") 
-            tf.extractall(pyxml_base_path)
-            tf.close()
-
-            #patch
-            pyxml_version = os.listdir(pyxml_base_path)[0]            
-            pyxml_path = os.path.join(pyxml_base_path, pyxml_version)
-            olddir = os.getcwd()
-            os.chdir(pyxml_path)
-            logger.notify("PyXML -> python version >= 2.6 : do patch %s : %s " % (pyxml_path, URLS['PYXML']['patch']))
-            p = patch.fromfile(URLS['PYXML']['patch'])
-            p.apply()
-            os.chdir(olddir)
-            logger.notify("PyXML -> python version >= 2.6 : install")
-            call_subprocess([os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-E', os.path.abspath(home_dir), '--build='+os.path.abspath(pyxml_base_path), '--no-download', pyxml_version],
-                    cwd=os.path.abspath(tmp_dir),
-                    filter_stdout=filter_python_develop,
-                    show_stdout=True)
-        else:
-            call_subprocess([os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-E', os.path.abspath(home_dir), URLS['PYXML'][res_source_key]],
-                    cwd=os.path.abspath(tmp_dir),
-                    filter_stdout=filter_python_develop,
-                    show_stdout=True)
         
         
         NORMAL_INSTALL = [ #(key,method)
-            ('DISTRIBUTE', 'pip', None),
             ('PSYCOPG2', 'pip', None),
             ('MYSQL', 'pip', None),
             ('PIL', 'pip', None), 
@@ -215,30 +231,11 @@
             ('DJANGO-EXTENSIONS', 'pip', None),
             ('DJANGO-REGISTRATION', 'easy_install', '-Z')
             ]
-         
-         if sys.version_info < (2,6):
-             NORMAL_INSTALL.append(('JSON','pip'))
         
             
-        for key, method, options in NORMAL_INSTALL:
-            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]]
-                if options :
-                    args.insert(4,options)
-                call_subprocess(args,
-                        cwd=os.path.abspath(tmp_dir),
-                        filter_stdout=filter_python_develop,
-                        show_stdout=True)
-            else:
-                args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), URLS[key][res_source_key]]
-                if options :
-                    args.insert(1,options)
-                call_subprocess(args,
-                        cwd=os.path.abspath(tmp_dir),
-                        filter_stdout=filter_python_develop,
-                        show_stdout=True)
-                
+        for key, method, option_str in NORMAL_INSTALL:
+            if key not in ignore_packages:
+                normal_install(key, method, option_str, res_source_key, home_dir, tmp_dir)
                         
         logger.notify("Clear source dir")
         shutil.rmtree(src_dir)
@@ -249,6 +246,27 @@
     logger.notify('Run "%s Package" to install new packages that provide builds'
                   % join(script_dir, 'easy_install'))
 
+
+def normal_install(key, method, option_str, 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]]
+        if option_str :
+            args.insert(4,option_str)
+        call_subprocess(args,
+                cwd=os.path.abspath(tmp_dir),
+                filter_stdout=filter_python_develop,
+                show_stdout=True)
+    else:
+        args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), URLS[key][res_source_key]]
+        if option_str :
+            args.insert(1,option_str)
+        call_subprocess(args,
+                cwd=os.path.abspath(tmp_dir),
+                filter_stdout=filter_python_develop,
+                show_stdout=True)
+    
+
 def ensure_dir(dir):
     if not os.path.exists(dir):
         logger.notify('Creating directory %s' % dir)
Binary file sbin/virtualenv/res/src/django-extensions-0.4.1.tar.gz has changed
Binary file sbin/virtualenv/res/src/simplejson-2.1.1.tar.gz has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/.htaccess.tmpl	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,1 @@
+RedirectMatch permanent /~ymh/eulalie/?$ /~ymh/eulalie/eulalie
--- a/web/eulalie/__init__.py	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/eulalie/__init__.py	Thu Jun 10 19:19:13 2010 +0200
@@ -1,4 +1,4 @@
-VERSION = (0,2)
+VERSION = (0,3)
 
 VERSION_STR = unicode(".".join(map(lambda i:"%02d" % (i,), VERSION)))
 
--- a/web/eulalie/config.py.tmpl	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/eulalie/config.py.tmpl	Thu Jun 10 19:19:13 2010 +0200
@@ -23,7 +23,7 @@
 # trailing slash.
 # Examples: "http://foo.com/media/", "/media/".
 ADMIN_MEDIA_PREFIX = MEDIA_URL + 'admin/'
-IRIUSER_MEDIA_PREFIX = MEDIA_URL + 'iriuser/'
+LDT_MEDIA_PREFIX = MEDIA_URL + 'ldt/'
 
 DATABASES = {
     'default': {
@@ -60,3 +60,5 @@
 ACCOUNT_ACTIVATION_DAYS = 7
 REGISTRATION_OPEN = False
 
+LDT_MAX_SEARCH_NUMBER = 50
+LDT_JSON_DEFAULT_INDENT = 2
--- a/web/eulalie/settings.py	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/eulalie/settings.py	Thu Jun 10 19:19:13 2010 +0200
@@ -60,7 +60,7 @@
 # Examples: "http://foo.com/media/", "/media/".
 ADMIN_MEDIA_PREFIX = '/media/'
 
-IRIUSER_MEDIA_PREFIX = '/iriuser/'
+LDT_MEDIA_PREFIX = '/ldt/'
 
 # Make this unique, and don't share it with anybody.
 SECRET_KEY = 't^lii5_z@tho$%6t&b#dm#t9nz$$ylyclxvkdiyqbl+(dnt(ma'
@@ -86,7 +86,7 @@
     "django.core.context_processors.debug",
     "django.core.context_processors.i18n",
     "django.core.context_processors.media",
-    "iriuser.utils.context_processors.iriuser",
+    "ldt.utils.context_processors.ldt",
     "eulalie.utils.context_processors.version",
     "eulalie.utils.context_processors.base",
 )
@@ -111,11 +111,11 @@
     'django.contrib.admin',
     'eulalie',
     'registration',
-    'iriuser',
-    'iriuser.core',
-    'iriuser.ldt',
-    'iriuser.user',
-    'iriuser.management',
+    'ldt',
+    'ldt.core',
+    'ldt.ldt_utils',
+    'ldt.user',
+    'ldt.management',
 )
 
 DECOUPAGE_BLACKLIST = (
@@ -126,12 +126,15 @@
      "__MACOSX",
 )
 
+ACCOUNT_ACTIVATION_DAYS = 7 
+
+LDT_MAX_SEARCH_NUMBER = 50
+LDT_JSON_DEFAULT_INDENT = 2
+
+
 from config import *
 
 LOGIN_URL = BASE_URL + 'eulalie/accounts/login/'
 LOGOUT_URL = BASE_URL + 'eulalie'
-ACCOUNT_ACTIVATION_DAYS = 7 
 
 
-
-
--- a/web/eulalie/templates/base.html	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/eulalie/templates/base.html	Thu Jun 10 19:19:13 2010 +0200
@@ -6,11 +6,11 @@
 <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 %}Tic-Tac{% endblock %}</title>
+    <title>{% block title %}Eulalie{% 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="{{IRIUSER_MEDIA_PREFIX}}js/jquery.validate.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" />
@@ -20,8 +20,8 @@
     <![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="{{IRIUSER_MEDIA_PREFIX}}/css/style.css" type="text/css"/>
-    <link rel="stylesheet" href="{{IRIUSER_MEDIA_PREFIX}}/js/login_ajax/login_ajax.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 %}
     
     {% block js_declaration %}
@@ -33,7 +33,7 @@
 	<div id="header" class="span-24 last">      
 		{% block header %}
 		<div id="header_left">
-                   <a href="{% url eulalie.views.workspace %}">TIC-TAC</a>
+                   <a href="{% url eulalie.views.workspace %}">Eulalie</a>
 		</div>
 		{% endblock %}
 	</div>
--- a/web/eulalie/templates/eulalie/workspace.html	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/eulalie/templates/eulalie/workspace.html	Thu Jun 10 19:19:13 2010 +0200
@@ -55,8 +55,9 @@
 {% for content in contents %}
     <tr>
         <td>{{ content.title }}</td>
-        <td><a href="{% url iriuser.ldt.views.index content.iri_id %}" class="ldt_link">{% trans "open ldt" %}</a></td>
-        <td><a href="{% url iriuser.ldt.views.create_project content.iri_id %}" class="ldt_link_create">{% trans "create project" %}</a></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>
+        <td><a href="{% url ldt.ldt_utils.views.project_json_externalid content.external_id %}" class="ldt_link">{% trans "link json by externalid" %}</a></td>
     </tr>
 {% endfor %}
 </table>
@@ -68,8 +69,9 @@
 {% for project in projects %}
     <tr>
         <td>{{ project.title }}</td>
-        <td><a href="{% url iriuser.ldt.views.indexProject project.ldt_id %}" class="ldt_link">{% trans "open ldt" %}</a></td>
-        <td><a href="{% url iriuser.ldt.views.copy_project project.ldt_id %}" class="ldt_link_create">{% trans "copy project" %}</a></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>
+        <td><a href="{% url ldt.ldt_utils.views.project_json_id project.ldt_id %}" class="ldt_link">{% trans "link json by id" %}</a></td>
     </tr>
 {% endfor %}
 </table>
--- a/web/eulalie/templates/iriuser/user/login_form.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-{% load i18n %}
-{# print user's state and form of login #}
-{% block js_import %}
-{{block.super}}
-
-    <script language="javascript">
-    var url_login_ajax='{{WEB_URL}}{% url iriuser.user.views.loginAjax %}';
-    {% if reload %}    
-        var reload=true;    
-    {% else %}
-        var reload=false;  
-    {% endif %}
-
-    $(document).ready(function(){
-        $('.login_link').nyroModal({
-                height:235, 
-                width:430, 
-                padding:0,
-                bgColor: 'rgb(239, 239, 239)',
-                });
-        })
-
-    </script>
-{% endblock %}
-{% 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 iriuser.user.views.profile  %}" >{% trans "Profiles" %}</a> </li>
-            <li><a href="{% url iriuser.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 iriuser.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">
-                <a href="#" class="nyroModalClose">X</a>
-                <div>{% trans "Log in" %}</div>             
-            </div>
-            <div id="msg"></div>
-            <div id="login_form" style="padding: 8px;" method="POST" action="">
-                <div style="float: right; padding-bottom: 8px;">
-                    <a href="{% url registration.views.register  %}" >{% trans "create account" %}</a>
-                </div>
-                <dl style="clear: both;">
-                    
-                    <dt><label for="username">{% trans "Pseudo" %}:</label></dt>
-                    <dd>
-                        <input class= "inputbox" type="text" style="width:148px" name="username" value="" id="username">
-                        <div id="login_form_username_error" class="ajaxform_error">{% trans "this field is compulsory" %}</div>
-                    </dd>
-               
-                
-                    <dt><label for="password">{% trans "Password" %}: </label></dt>
-                    <dd>
-                        <input class= "inputbox" type="password" style="width:148px" name="password" value="" id="password" >
-                        <div id="login_form_password_error" class="ajaxform_error">{% trans "this field is compulsory" %}</div>
-                    </dd>
-                    <dt/>
-                    <dd>
-                        <a href="{% url django.contrib.auth.views.password_reset  %}" >{% trans "reset password" %}</a>
-                    </dd>
-                </dl>
-                <input class="button" id="submit" type="submit" value="{% trans 'Connection' %}"/>  
-            </div>
-
-        </div>
-</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/eulalie/templates/ldt/user/login_form.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,78 @@
+{% load i18n %}
+{# print user's state and form of login #}
+{% block js_import %}
+{{block.super}}
+
+    <script language="javascript">
+    var url_login_ajax='{{WEB_URL}}{% url ldt.user.views.loginAjax %}';
+    {% if reload %}    
+        var reload=true;    
+    {% else %}
+        var reload=false;  
+    {% endif %}
+
+    $(document).ready(function(){
+        $('.login_link').nyroModal({
+                height:235, 
+                width:430, 
+                padding:0,
+                bgColor: 'rgb(239, 239, 239)',
+                });
+        })
+
+    </script>
+{% endblock %}
+{% 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">
+                <a href="#" class="nyroModalClose">X</a>
+                <div>{% trans "Log in" %}</div>             
+            </div>
+            <div id="msg"></div>
+            <div id="login_form" style="padding: 8px;" method="POST" action="">
+                <div style="float: right; padding-bottom: 8px;">
+                    <a href="{% url registration.views.register  %}" >{% trans "create account" %}</a>
+                </div>
+                <dl style="clear: both;">
+                    
+                    <dt><label for="username">{% trans "Pseudo" %}:</label></dt>
+                    <dd>
+                        <input class= "inputbox" type="text" style="width:148px" name="username" value="" id="username">
+                        <div id="login_form_username_error" class="ajaxform_error">{% trans "this field is compulsory" %}</div>
+                    </dd>
+               
+                
+                    <dt><label for="password">{% trans "Password" %}: </label></dt>
+                    <dd>
+                        <input class= "inputbox" type="password" style="width:148px" name="password" value="" id="password" >
+                        <div id="login_form_password_error" class="ajaxform_error">{% trans "this field is compulsory" %}</div>
+                    </dd>
+                    <dt/>
+                    <dd>
+                        <a href="{% url django.contrib.auth.views.password_reset  %}" >{% trans "reset password" %}</a>
+                    </dd>
+                </dl>
+                <input class="button" id="submit" type="submit" value="{% trans 'Connection' %}"/>  
+            </div>
+
+        </div>
+</div>
--- a/web/eulalie/templates/registration/login.html	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/eulalie/templates/registration/login.html	Thu Jun 10 19:19:13 2010 +0200
@@ -19,7 +19,7 @@
 
         <form action="" method='post' id="login-form">
             {% csrf_token %}
-            <input type="hidden" name="next" value="{% url iriuser.user.views.profile%}" />            
+            <input type="hidden" name="next" value="{% url ldt.user.views.profile%}" />            
         <ul id="login_fields_list">
         {{form.as_ul}}
         <li><input class="button"type="submit" value="{% trans "login" %}" /></li>
--- a/web/eulalie/urls.py	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/eulalie/urls.py	Thu Jun 10 19:19:13 2010 +0200
@@ -16,8 +16,8 @@
     (r'^admin/', include(admin.site.urls)),
     (r'^i18n/', include('django.conf.urls.i18n')),
 
-    (r'^ldt/', include('iriuser.ldt.urls')),
-    (r'^user/', include('iriuser.user.urls')),
+    (r'^ldt/', include('ldt.ldt_utils.urls')),
+    (r'^user/', include('ldt.user.urls')),
 
     (r'^accounts/', include('registration.backends.default.urls')),
 
--- a/web/eulalie/views.py	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/eulalie/views.py	Thu Jun 10 19:19:13 2010 +0200
@@ -1,7 +1,7 @@
 from django.shortcuts import render_to_response
 from django.contrib.auth.decorators import login_required
 from django.template import RequestContext
-from iriuser.ldt.models import Content, Project
+from ldt.ldt_utils.models import Content, Project
 
 
 @login_required
--- a/web/ldt/core/handlers/modpython.py	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/ldt/core/handlers/modpython.py	Thu Jun 10 19:19:13 2010 +0200
@@ -1,6 +1,8 @@
-import django.core.handlers.modpython
 
 def handler(req):
     activate_this = req.get_options().get("virtualenv.activate_path")
     execfile(activate_this, dict(__file__=activate_this))    
+
+    import django.core.handlers.modpython
+
     return django.core.handlers.modpython.handler(req)
\ No newline at end of file
--- a/web/ldt/ldt/__init__.py	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-import lucene
-from django.conf import settings
-
-lucene.initVM(lucene.CLASSPATH)
-
-STORE = lucene.FSDirectory.getDirectory(settings.INDEX_PATH, False)
-ANALYZER = lucene.PerFieldAnalyzerWrapper(lucene.StandardAnalyzer())
-ANALYZER.addAnalyzer("tags",lucene.FrenchAnalyzer())
-ANALYZER.addAnalyzer("title",lucene.FrenchAnalyzer())
-ANALYZER.addAnalyzer("abstract",lucene.FrenchAnalyzer())
-ANALYZER.addAnalyzer("all",lucene.FrenchAnalyzer())
-
-VERSION  = (0,1)
-VERSION_STR = unicode(".".join(map(lambda i:"%02d" % (i,), VERSION)))
--- a/web/ldt/ldt/admin.py	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-from django.contrib import admin
-from django.conf.urls.defaults import *
-from django.shortcuts import render_to_response
-from django.template import RequestContext
-from django.conf import settings
-from models import *
-from forms import *
-from fileimport import *
-from ldt.ldt import STORE
-from ldt.ldt import ANALYZER
-
-import lucene
-
-admin.site.register(Project)
-
-class ContentAdmin(admin.ModelAdmin):
-    
-    def import_file(self, request):
-        if request.method =='POST':
-            form = LdtImportForm(request.POST, request.FILES)
-            if form.is_valid():
-                filetoprocess =form.cleaned_data['importFile']
-                flatten = form.cleaned_data['flatten']
-                videoPath = form.cleaned_data['videoPath']
-                # fi = None
-                fi = FileImport(filetoprocess, videoPath, flatten)
-                try:
-                    fi.processFile()
-                    args = {'message': "File imported"}
-                except FileImportError:
-                    non_field_errors = form.non_field_errors()
-                    non_field_errors.append("Error when importing : unknown file type")
-                    form._errors["__all__"] = non_field_errors
-                    args = {'message': "Can not import file, unknown file type", 'form': form}
-                    
-            else:
-                non_field_errors = form.non_field_errors()
-                non_field_errors.append("Error when importing : invalid form")
-                form._errors["__all__"] = non_field_errors
-                args = {'message': "Error when importing : invalid form", 'form': form}
-        else:
-            form = LdtImportForm()
-            args = {'form': form, 'current_app': self.admin_site.name, 'current_action' : 'import_file'}
-        return render_to_response('admin/ldt/content/upload_form.html', args, context_instance=RequestContext(request))
-
-    def reindex(self, request):
-        message = None
-        if request.method == "POST":
-            form = ReindexForm(request.POST)
-            if form.is_valid():    
-                # try:
-                writer = lucene.IndexWriter(STORE, ANALYZER, True)
-                writer.setMaxFieldLength(1048576)
-                contentList = form.cleaned_data["contents"]
-                indexer = ContentIndexer(contentList,writer)
-                indexer.index_all()
-
-                writer.close()
-                message = "Indexation ok : " + repr(form.cleaned_data["contents"]) 
-                form = ReindexForm()
-                # except Exception, inst:
-                    # non_field_errors = form.non_field_errors()
-                    # non_field_errors.append("Error when reindexing : " + cgi.escape(repr(inst)))
-                    # form._errors["__all__"] = non_field_errors
-                    #message = "ERROR : " + repr(non_field_errors)
-        else:
-            form = ReindexForm()
-    
-        return render_to_response('admin/ldt/content/reindex_form.html', {'form': form, 'message':message, 'current_app': self.admin_site.name, 'current_action' : 'reindex' }, context_instance=RequestContext(request))
-
-    def get_urls(self):
-        urls = super(ContentAdmin, self).get_urls()
-        content_urls = patterns('',
-            url(r'^reindex/$', self.admin_site.admin_view(self.reindex), name="ldt_content_reindex"),
-    # (r'^admin/ldt/content/import/upload/$', 'ldt.ldt.views.uploadFile'),                                
-            url(r'^import/$', self.admin_site.admin_view(self.import_file), name="ldt_content_import_file")
-        )
-        return content_urls + urls
-
-
-admin.site.register(Content, ContentAdmin)
--- a/web/ldt/ldt/contentindexer.py	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,206 +0,0 @@
-import tempfile
-import os
-import os.path
-import shutil
-from ldt.utils import zipfileext
-import urllib
-# import ldt.utils.log
-import ldt.utils.xml
-from django.conf import settings
-from models import Content
-import xml
-import xml.dom
-import xml.dom.minidom
-import xml.dom.ext
-import xml.xpath
-import fnmatch
-import uuid
-import shutil
-import lucene
-from ldt.ldt import STORE
-from ldt.ldt import ANALYZER
-
-def Property(func):
-    return property(**func()) 
-
-
-class ContentIndexer(object):
-        
-        def __init__(self, contentList, writer, decoupage_blackList = settings.DECOUPAGE_BLACKLIST):
-                self.__contentList = contentList
-                self.__decoupage_blacklist = decoupage_blackList
-                self.__writer = writer
-                    
-        @Property
-        def decoupage_blacklist(): #@NoSelf
-            doc = """get blacklist""" #@UnusedVariable
-           
-            def fget(self):
-                if self.__decoupage_blacklist is None:
-                    self.__decoupage_blacklist = ()
-                return self.__decoupage_blacklist
-               
-            def fset(self, value):
-                self.__decoupage_blacklist = value
-               
-            def fdel(self):
-                del self.__decoupage_blacklist
-               
-            return locals()
-                   
-        def index_all(self):
-            for content in self.__contentList:
-                self.index_content(content)
-                
-        def index_content(self, content):
-            url =content.iri_url()
-            filepath = urllib.urlopen(url)
-            doc = xml.dom.minidom.parse(filepath)
-                                    
-            self.__writer.deleteDocuments(lucene.Term("iri_id", content.iri_id))
-            
-            con = xml.xpath.Context.Context(doc, 1, 1, None)
-            res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble", context=con)
-
-            for ensemble in res:
-                ensembleId = ensemble.getAttribute("id")
-                
-                for decoupageNode in ensemble.childNodes:
-                    if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage"  or decoupageNode.getAttribute("id") in self.decoupage_blacklist:
-                        continue
-                    
-                    decoupId = decoupageNode.getAttribute("id")
-                    res = xml.xpath.Evaluate("elements/element", decoupageNode)
-                    for elementNode in res:
-                        doc = lucene.Document()
-                        elementId = elementNode.getAttribute("id")
-                        tags = elementNode.getAttribute("tags")
-                        
-                        if tags is not None:                            
-                            tags.replace(",", ";")
-                        
-                        if tags is None or len(tags) == 0:
-                            tags = ""
-                            restagnode = xml.xpath.Evaluate("tag/text()", elementNode)
-                            for tagnode in restagnode:
-                                tags = tags + " ; " + tagnode.data
-                                
-                        if tags is None or len(tags) == 0:
-                            tags = ""
-                            restagnode = xml.xpath.Evaluate("tags/tag/text()", elementNode)
-                            for tagnode in restagnode:
-                                tags = tags + " ; " + tagnode.data                            
-    
-                        title = ""
-                        for txtRes in xml.xpath.Evaluate("title/text()", elementNode): 
-                            title = title + txtRes.data 
-                
-                        abstract = ""
-                        for txtRes in xml.xpath.Evaluate("abstract/text()", elementNode): 
-                            abstract = abstract + txtRes.data 
-                
-                        doc.add(lucene.Field("iri_id", content.iri_id, lucene.Field.Store.YES, lucene.Field.Index.UN_TOKENIZED))
-                        doc.add(lucene.Field("ensemble_id", ensembleId, lucene.Field.Store.YES, lucene.Field.Index.NO))
-                        doc.add(lucene.Field("decoupage_id", decoupId, lucene.Field.Store.YES, lucene.Field.Index.NO))
-                        doc.add(lucene.Field("element_id", elementId, lucene.Field.Store.YES, lucene.Field.Index.NO))
-                        doc.add(lucene.Field("tags", tags, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
-                        doc.add(lucene.Field("title", title, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
-                        doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
-                        doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
-            
-                        self.__writer.addDocument(doc)
-            
-            self.__writer.flush()
-            
-            
-class ProjectIndexer(object):
-        
-        def __init__(self, projectList, writer, decoupage_blackList = settings.DECOUPAGE_BLACKLIST):
-                self.__projectList = projectList
-                self.__decoupage_blacklist = decoupage_blackList
-                self.__writer = writer
-                
-        @Property
-        def decoupage_blacklist(): #@NoSelf
-            doc = """get blacklist""" #@UnusedVariable
-           
-            def fget(self):
-                if self.__decoupage_blacklist is None:
-                    self.__decoupage_blacklist = ()
-                return self.__decoupage_blacklist
-               
-            def fset(self, value):
-                self.__decoupage_blacklist = value
-               
-            def fdel(self):
-                del self.__decoupage_blacklist
-               
-            return locals()
-                   
-        def index_all(self):
-            for project in self.__projectList:
-                self.index_project(project)
- 
-        def index_project(self, project):
-            
-            # pocketfilms.utils.log.debug("Indexing project : "+str(project.iri_id))
-            doc = xml.dom.minidom.parseString(project.ldt)
-
-            self.__writer.deleteDocuments(lucene.Term("iri_id", project.iri_id))
-            
-            con = xml.xpath.Context.Context(doc, 1, 1, None)
-            res = xml.xpath.Evaluate("/iri/annotations/content", context=con)
-
-            for content in res:
-                contentId = content.getAttribute("id")
-                
-                ensembleId = "ens_perso"
-                
-                for decoupageNode in content.childNodes:
-                    # pocketfilms.utils.log.debug("Indexing content decoupage : "+ repr(decoupageNode.nodeType) + " in " + repr(self.decoupage_blacklist))
-                    if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage"  or decoupageNode.getAttribute("id") in self.decoupage_blacklist:
-                        continue
-                    
-                    decoupId = decoupageNode.getAttribute("id")
-                    res = xml.xpath.Evaluate("elements/element", decoupageNode)
-                    for elementNode in res:
-                        doc = lucene.Document()
-                        elementId = elementNode.getAttribute("id")
-                        tags = elementNode.getAttribute("tags")
-                        
-                        if tags is not None:                            
-                            tags.replace(",", ";")
-                        
-                        if tags is None or len(tags) == 0:
-                            tags = ""
-                            restagnode = xml.xpath.Evaluate("tag/text()", elementNode)
-                            for tagnode in restagnode:
-                                tags = tags + " ; " + tagnode.data
-                                
-                        if tags is None or len(tags) == 0:
-                            tags = ""
-                            restagnode = xml.xpath.Evaluate("tags/tag/text()", elementNode)
-                            for tagnode in restagnode:
-                                tags = tags + " ; " + tagnode.data                            
-    
-                        title = ""
-                        for txtRes in xml.xpath.Evaluate("title/text()", elementNode): 
-                            title = title + txtRes.data 
-                
-                        abstract = ""
-                        for txtRes in xml.xpath.Evaluate("abstract/text()", elementNode): 
-                            abstract = abstract + txtRes.data 
-                
-                        doc.add(lucene.Field("project_id", project.iri_id, lucene.Field.Store.YES, lucene.Field.Index.UN_TOKENIZED))              
-                        doc.add(lucene.Field("iri_id", contentId, lucene.Field.Store.YES, lucene.Field.Index.UN_TOKENIZED))
-                        doc.add(lucene.Field("ensemble_id", ensembleId, lucene.Field.Store.YES, lucene.Field.Index.NO))
-                        doc.add(lucene.Field("decoupage_id", decoupId, lucene.Field.Store.YES, lucene.Field.Index.NO))
-                        doc.add(lucene.Field("element_id", elementId, lucene.Field.Store.YES, lucene.Field.Index.NO))
-                        doc.add(lucene.Field("tags", tags, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
-                        doc.add(lucene.Field("title", title, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
-                        doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
-                        doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
-            
-                        self.__writer.addDocument(doc)
-            
-            self.__writer.flush()
--- a/web/ldt/ldt/fileimport.py	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,375 +0,0 @@
-import tempfile
-import os.path
-import shutil
-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 uuid
-import urllib
-
-class FileImportError(Exception):
-    def __init__(self, value):
-        self.value = value
-    def __str__(self):
-        return repr(self.value)
-
-
-def Property(func):
-    return property(**func()) 
-
-class IriInfo(object):
-
-    
-    def __init__(self, id, order, titledesc, basepath="", videopath=settings.STREAM_URL, decoupage_blacklist = settings.DECOUPAGE_BLACKLIST, flatten = True):
-        self.id = id
-        self.basepath = basepath
-        self.order = order
-        self.src = ""
-        self.annotations = None
-        self.videopath = videopath
-        self.videourl = ""
-        self.title = None
-        self.desc = None
-        self.created = False
-        self.content = None
-        self.decoupage_blacklist = decoupage_blacklist
-        if self.decoupage_blacklist is None:
-            self.decoupage_blacklist = ()
-        self.flatten = flatten
-        
-        
-    
-    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)            
-            con = xml.xpath.Context.Context(doc, 1, 1, None)
-            #open .iri and get the title
-            res = xml.xpath.Evaluate("/iri/head/meta[@name='title']/@content", context=con)
-            self.title = res[0].value
-            
-        #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)
-            
-            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 = xml.xpath.Evaluate("/iri/body/ensembles",context=con)
-        ensemblesnode = res[0]
-
-        ensembleids = []
-
-        for node in ensemblesnode.childNodes:
-            if node.nodeType == xml.dom.Node.ELEMENT_NODE and node.tagName == "ensemble":
-                id = node.getAttribute("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":
-                    if newEnsemble is None:
-                        newensemble = doc.createElement('ensemble')
-                        ensembleid = self.id+"_"+str(uuid.uuid1())
-                        newensemble.setAttribute('id',ensembleid)
-            
-                        newensemble.setAttribute('title', self.annotations.getAttribute('title'))
-                        newensemble.setAttribute('author', self.annotations.getAttribute('author'))
-                        newensemble.setAttribute('date', self.annotations.getAttribute('date'))
-                        newensemble.setAttribute('abstract', self.annotations.getAttribute('abstract'))
-                        ensemblesnode.appendChild(newensemble)
-                        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)
-                    if ensembleid in ensembleids:
-                        ensembleid = self.id+"_"+str(uuid.uuid1())
-                        cloneNode.setAttribute(u"id", ensembleid)
-                    ensembleids.append(ensembleid)
-                    ensemblesnode.appendChild(cloneNode)
-
-        if self.flatten:
-            res = xml.xpath.Evaluate("/iri/body/medias/media[@id='video']/video", context=con)
-            src_video = res[0].getAttribute('src')
-            self.videourl = os.path.basename(src_video)
-            res[0].setAttribute('src', self.videourl)
-            
-        f = open(path, "w")
-        try:
-            xml.dom.ext.Print(doc, stream=f)
-        finally:
-            f.close()
-        
-        
-        destPath = os.path.join(os.path.join(os.path.join(settings.MEDIA_ROOT, "media"), "ldt"), self.id);
-        if not os.path.exists(destPath):
-            os.makedirs(destPath)
-        shutil.move(os.path.join(self.basepath, self.src), os.path.join(destPath, os.path.basename(self.src)))
-        self.src = self.id + u"/" + os.path.basename(self.src)
-
-
-
-    def saveContent(self):
-        #if 'http' in self.src:
-        #    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 = {'iriurl': self.src, 'title':self.title, 'description':self.desc, 'videopath': self.videopath})
-        if not self.created:
-            content.iriurl = self.src
-            content.title = self.title
-            content.description = self.desc
-            content.save()
-
-        content.iriurl = self.src
-        content.videopath = self.videopath.rstrip("/") + "/"
-
-        content.iri = self.id + u"/" + os.path.basename(self.src)
-        content.title = self.title
-        content.description = self.desc
-        content.save()
-
-        self.content = content
-            
-    def process(self):
-        self.processIri()
-        self.saveContent()
-        
-class BaseFileImport(object):
-
-    def __init__(self, filepath, videopath):
-        self.__filepath = filepath
-        self.__tempdir = ""
-        self.__videopath = videopath
-        self.__author = None
-
-        
-    def filepath(): #@NoSelf
-        doc = """Docstring""" #@UnusedVariable
-       
-        def fget(self):
-            return self.__filepath
-           
-        def fset(self, value):
-            self.__filepath = value
-           
-        def fdel(self):
-            del self.__filepath
-           
-        return locals()
-       
-    filepath = property(**filepath())
-    
-    def videopath(): #@NoSelf
-        doc = """Docstring""" #@UnusedVariable
-       
-        def fget(self):
-            return self.__videopath
-           
-        def fset(self, value):
-            self.__videopath = value
-           
-        def fdel(self):
-            del self.__videopath
-           
-        return locals()
-       
-    videopath = property(**videopath())
-
-    def author(): #@NoSelf
-        doc = """Docstring""" #@UnusedVariable
-       
-        def fget(self):
-            return self.__author
-           
-        def fset(self, value):
-            self.__author = value
-           
-        def fdel(self):
-            del self.__author
-           
-        return locals()
-
-    author = property(**author())
-    
-       
-class FileImport(BaseFileImport):
-
-    def __init__(self, filepath, videopath, flatten):
-        BaseFileImport.__init__(self, filepath, videopath)
-        self.__checkExistingMedia = False
-        self.__flatten = flatten
-        
-    def checkExistingMedia(): #@NoSelf
-        doc = """Docstring""" #@UnusedVariable
-       
-        def fget(self):
-            return self.__checkExistingMedia
-           
-        def fset(self, value):
-            self.__checkExistingMedia = value
-           
-        def fdel(self):
-            del self.__checkExistingMedia
-           
-        return locals()
-
-    checkExistingMedia = property(**checkExistingMedia())    
-
-    def flatten(): #@NoSelf
-        doc = """Docstring""" #@UnusedVariable
-       
-        def fget(self):
-            return self.__flatten
-           
-        def fset(self, value):
-            self.__flatten = value
-           
-        def fdel(self):
-            del self.__flatten
-           
-        return locals()
-    flatten = property(**flatten())
-
-    def processLdt(self, ldtpath=None):
-        
-        # list iri
-        # see if there is some comments
-        # inject comment in iri
-        # 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)
-        
-        con = xml.xpath.Context.Context(doc, 1, 1, None)
-        
-        #get author from file ldt
-        result = xml.xpath.Evaluate("/iri/project", context=con)
-        for pnode in result:
-            author = pnode.getAttribute("user")
-            if author:
-                self.author = unicode(author)
-                break 
-
-        result = xml.xpath.Evaluate("/iri/medias/media", context=con)
-        
-        for i, medianode in  enumerate(result):
-        # get iri file's id from file ldt
-            id = medianode.attributes['id'].value
-            if self.checkExistingMedia:
-                try:
-                    Content.objects.get(iri_id=id)
-                    do_pass = True
-                except ObjectDoesNotExist: #Content.DoesNotExist
-                    do_pass = False
-            else:
-                    do_pass = False
-            if not do_pass:
-                if not (contents.has_key(id)):
-                    # Create instance iriInfo(id, order, titledesc, basepath="", videopath=settings.STREAM_URL)
-                    if ldtpath:
-                        contents[id] = IriInfo(id, i, "", os.path.dirname(ldtpath), flatten=self.flatten)
-                    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
-                elif self.videopath !="" or self.videopath:
-                    contents[id].videopath = self.videopath
-                else:
-                    contents[id].videopath =settings.STREAM_URL
-                    
-                
-        #get annotation of file ldt
-        result = xml.xpath.Evaluate("/iri/annotations/content", context=con)
-        
-        for contentnode in result:
-            id = contentnode.attributes['id'].value
-            # pocketfilms.utils.log.debug("ID : " + str(id))
-            if contents.has_key(id):
-                if self.author:
-                    contentnode.setAttribute("author", unicode(self.author))
-                contents[id].annotations = contentnode
-        
-        #go throught values
-        for iriinfo in contents.values():
-            
-            iriinfo.process()
-            
-            # if yes update
-            # if no create
-            # move iri file to the proper place
-            #return list of iriInfo
-        
-    def processFile(self):
-        if self.filepath.name.endswith(".ldt"):
-            self.processLdt()
-        elif self.filepath.name.endswith(".zip"):
-            self.processZip()
-        else:
-            raise FileImportError("Bad file type")
-
-
-    def processZip(self):
-    # """ extraire .zip, pass to method processLdt"""
-        # create temp directory
-        self.__tempdir = tempfile.mkdtemp()
-        openfiles = []
-        flvfiles = []
-        processedids = []
-        
-        try:
-            zipfile = zipfileext.ZipFileExt(self.filepath)
-            zipfile.unzip_into_dir(self.__tempdir)
-            #load ldt
-            foldersToProcess = [self.__tempdir]
-            while len(foldersToProcess):
-                # pocketfilms.utils.log.debug("folder stack length : "+ str(len(foldersToProcess)))
-                currentFolder = foldersToProcess.pop()
-                for entry in os.listdir(currentFolder):
-                    if entry in settings.ZIP_BLACKLIST:
-                        continue
-                    entryPath = os.path.join(currentFolder, entry)
-                    if(os.path.isdir(entryPath)):
-                        # pocketfilms.utils.log.debug("Push folder : " + entryPath)
-                        foldersToProcess.append(entryPath)
-                    elif fnmatch.fnmatch(entry, "*.ldt"):
-                        # pocketfilms.utils.log.debug("Process file : " + entryPath)
-                        ldtid = self.processLdt(entryPath)
-                        processedids.append(ldtid)
-                    elif fnmatch.fnmatch(entry, "*.flv"):
-                        flvfiles.append(entryPath)
-             
-            if settings.CONTENT_ROOT and os.path.exists(settings.CONTENT_ROOT): 
-                for entry in flvfiles:
-                    shutil.copy(entry, settings.CONTENT_ROOT)
-                    
-        finally:
-            for f in openfiles:
-                f.close()
-            shutil.rmtree(self.__tempdir)
-        # delete directory
-        return processedids
-        
-    # def processFileLdt(self):
-        # processedids = []
-        # ldtid = self.processLdt(self.filepath)
-        # processedids.append(ldtid)
-        # return processedids
--- a/web/ldt/ldt/forms.py	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-from django import forms
-from models import Project, Content
-import uuid
-
-class LdtImportForm(forms.Form):
-    importFile = forms.FileField()
-    videoPath = forms.CharField(required=False)
-    flatten = forms.BooleanField(required=False, initial=True)   
-    
-class LdtAddForm(forms.ModelForm):
-    title = forms.CharField()
-    # contents = forms.ModelMultipleChoiceField(Content.objects.all())
-    # owner = forms.ModelChoiceField(Author.objects.all())
-    class Meta:
-        model = Project
-        exclude = ("ldt_id", "ldt", "created_by", "changed_by", "creation_date", "modification_date", "state", "owner")   
-
-class ReindexForm(forms.Form):
-    contents = forms.ModelMultipleChoiceField(Content.objects.all())
-
-class SearchForm(forms.Form):
-    search = forms.CharField()
-    field = forms.ChoiceField([(u"all", u"all"), (u"title", u"title"), (u"abstract", u"resume"), (u"tags", u"tags")])
-
-class AddProjectForm (forms.Form):
-    title = forms.CharField()
-
-class CopyProjectForm (forms.Form):
-    title = forms.CharField()
--- a/web/ldt/ldt/models.py	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-from django.db import models
-from django.conf import settings
-from ldt.core.models import Document, Owner
-from django.utils.translation import ugettext_lazy as _
-from utils import create_ldt, copy_ldt
-import uuid
-
-class Content(models.Model):
-    iri_id = models.CharField(max_length=1024, unique=True)
-    iriurl = models.URLField()
-    videopath = models.URLField(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)
-    
-    def __unicode__(self):
-        return str(self.id) + ": " + self.iri_id
-        
-    def iri_url(self, web_url=settings.WEB_URL):
-        if 'http' in self.iriurl or 'https' in self.iriurl:
-            return self.iriurl
-        else:
-            return unicode(web_url) + unicode(settings.MEDIA_URL)+u"media/ldt/"+unicode(self.iriurl)
-        
-        
-class Project(Document):  
-    STATE_CHOICES=(
-    (1, 'edition'),
-    (2, 'published'),
-    (3, 'moderated'),
-    (4, 'rejected'),
-    (5, 'deleted')
-    )
-    ldt_id = models.CharField(max_length=1024, unique=True)
-    ldt = models.TextField(null=True)
-    title = models.CharField(max_length=1024)
-    contents = models.ManyToManyField(Content)
-    creation_date = models.DateTimeField(auto_now_add=True)
-    modification_date = models.DateTimeField(auto_now=True)
-    created_by = models.CharField(_("created by"), max_length=70)
-    changed_by = models.CharField(_("changed by"), max_length=70)
-    state = models.IntegerField(choices=STATE_CHOICES, default=1)
-    
-    def __unicode__(self):
-        return unicode(self.id) + u": " + unicode(self.ldt_id)
-
-    @staticmethod
-    def create_project(user, title, contents):
-        owner = Owner.objects.get(user=user)
-        project = Project(title=title, owner=owner)
-        project.ldt_id = str(uuid.uuid1())
-        project.created_by=user.username
-        project.changed_by=user.username
-        project.state = 1
-        project.save()
-        for content in contents:
-            project.contents.add(content)
-        project.save()
-        return create_ldt(project, user)
-
-    def copy_project(self, user, title):
-        owner = Owner.objects.get(user=user)
-        project = Project(title=title, owner=owner)
-        project = copy_ldt(self, project, user)
-        project.save()
-        for content in self.contents.all():
-            project.contents.add(content)
-        project.save()
-        return project
-
--- a/web/ldt/ldt/projectindexer.py	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-import tempfile
-import os
-import os.path
-import shutil
-import ldt.utils.xml
-from ldt import settings
-import xml
-import xml.dom
-import xml.dom.minidom
-import xml.dom.ext
-import xml.xpath
-import lucene
-from ldt.ldt import STORE
-from ldt.ldt import ANALYZER
-
-def Property(func):
-    return property(**func()) 
-
-class ProjectIndexer(object):
-    def __init__(self, projectList, writer, decoupage_blackList = settings.DECOUPAGE_BLACKLIST):
-        self.__projectList = projectList
-        self.__decoupage_blacklist = decoupage_blackList
-        self.__writer = writer
-            
-    @Property
-    def decoupage_blacklist(): #@NoSelf
-        doc = """get blacklist""" #@UnusedVariable
-       
-        def fget(self):
-            if self.__decoupage_blacklist is None:
-                self.__decoupage_blacklist = ()
-            return self.__decoupage_blacklist
-           
-        def fset(self, value):
-            self.__decoupage_blacklist = value
-           
-        def fdel(self):
-            del self.__decoupage_blacklist
-           
-        return locals()
-               
-    def index_all(self):
-        for project in self.__projectList:
-            self.index_project(project)
-
-    def index_project(self, project):
-        # ldt.utils.log.debug("Indexing project : "+str(project.ldt_id))
-        ldt=project.ldt
-        doc = xml.dom.minidom.parseString(ldt.encode( "utf-8" ))
-        
-        self.__writer.deleteDocuments(lucene.Term("ldt_id", project.ldt_id))
-            
-        con = xml.xpath.Context.Context(doc, 1, 1, None)
-        res = xml.xpath.Evaluate("/iri/annotations/content", context=con)
-
-        for content in res:
-            contentId = content.getAttribute("id")
-            
-            res =xml.xpath.Evaluate("ensemble", content)
-            for ensemble in res:
-                ensembleId = ensemble.getAttribute("id")
-                
-                for decoupageNode in ensemble.childNodes:
-                    # ldt.utils.log.debug("Indexing project decoupage : "+ repr(decoupageNode.nodeType) + " in " + repr(self.decoupage_blacklist))
-                    if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage"  or decoupageNode.getAttribute("id") in self.decoupage_blacklist:
-                        continue
-                
-                    decoupId = decoupageNode.getAttribute("id")
-                    res = xml.xpath.Evaluate("elements/element", decoupageNode)
-                    for elementNode in res:
-                        doc = lucene.Document()
-                        elementId = elementNode.getAttribute("id")
-                        tags = elementNode.getAttribute("tags")
-                        
-                        if tags is not None:                            
-                            tags.replace(",", ";")
-                        
-                        if tags is None or len(tags) == 0:
-                            tags = ""
-                            restagnode = xml.xpath.Evaluate("tag/text()", elementNode)
-                            for tagnode in restagnode:
-                                tags = tags + " ; " + tagnode.data
-                                
-                        if tags is None or len(tags) == 0:
-                            tags = ""
-                            restagnode = xml.xpath.Evaluate("tags/tag/text()", elementNode)
-                            for tagnode in restagnode:
-                                tags = tags + " ; " + tagnode.data                            
-
-                        title = ""
-                        for txtRes in xml.xpath.Evaluate("title/text()", elementNode): 
-                            title = title + txtRes.data 
-                
-                        abstract = ""
-                        for txtRes in xml.xpath.Evaluate("abstract/text()", elementNode): 
-                            abstract = abstract + txtRes.data 
-                            
-                        doc.add(lucene.Field("ldt_id", project.ldt_id, lucene.Field.Store.YES, lucene.Field.Index.UN_TOKENIZED))              
-                        doc.add(lucene.Field("iri_id", contentId, lucene.Field.Store.YES, lucene.Field.Index.UN_TOKENIZED))
-                        doc.add(lucene.Field("ensemble_id", ensembleId, lucene.Field.Store.YES, lucene.Field.Index.NO))
-                        doc.add(lucene.Field("decoupage_id", decoupId, lucene.Field.Store.YES, lucene.Field.Index.NO))
-                        doc.add(lucene.Field("element_id", elementId, lucene.Field.Store.YES, lucene.Field.Index.NO))
-                        doc.add(lucene.Field("tags", tags, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
-                        doc.add(lucene.Field("title", title, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
-                        doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
-                        doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
-            
-                        self.__writer.addDocument(doc)
-    
-        self.__writer.flush()
\ No newline at end of file
--- a/web/ldt/ldt/templates/admin/ldt/app_action.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-{% extends "admin/base_site.html" %}
-{% load i18n %} 
-
-{% block breadcrumbs %}
-<div class="breadcrumbs"><a href="{% url admin:index %}">
-{% trans "Home" %}</a> &rsaquo; 
-<a href="{% url admin:app_list 'ldt' %}">
-ldt</a> &rsaquo;
-{{ current_action }}
-</div>{% endblock %}
-
--- a/web/ldt/ldt/templates/admin/ldt/app_index.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-{% extends "admin/app_index.html" %}
-{% load i18n %}
-
-{% block content %}
-{{ block.super }}
-
-        <div class="module">
-            <table summary="Import">
-                <caption>Import</caption>
-                <tr>
-                    <th>            
-                        <a href="{{WEB_URL}}{% url admin:ldt_content_import_file %}">Import an ldt</a>
-                    </th>
-                    <td>&nbsp;</td>
-                <!--tr>
-                    <th>            
-                        <a href="content/export/form">Generate ldt</a>
-                    </th>
-                    <td>&nbsp;</td>
-                </tr-->
-                <tr>
-                    <th>            
-                        <a href="{{WEB_URL}}{% url admin:ldt_content_reindex %}">Reindex</a>
-                    </th>
-                    <td>&nbsp;</td>         
-                </tr>
-            </table>
-        </div>
-
-{% endblock %}
--- a/web/ldt/ldt/templates/admin/ldt/content/reindex_form.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-{% extends "admin/ldt/app_action.html" %}
-{% load i18n %} 
-{# reindex contents #}
-
-{% block content %}
-
-{% if message %}
-<div>
-<p>
-{{ message }}
-</p>
-</div>
-{% endif %}
-{% if form. %}
-<div>
-</div>
-{% endif %}
-<div>
-<form method="post" action="{{WEB_URL}}{% url admin:ldt_content_reindex %}">
-    {% csrf_token %}
-	<table>
-	{{ form.as_table }}
-	</table>
-	<input type="submit"/>
-</form>
-</div>
-
-<a href="{{WEB_URL}}{% url admin:app_list 'ldt' %}" >Back to administration page</a>
-
-{% endblock %}
--- a/web/ldt/ldt/templates/admin/ldt/content/search_form.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-
-<form method="post" action="{{WEB_URL}}{% url ldt.ldt.views.searchIndex %}" accept-charset="utf-8">
-
-	<table>
-	{{ form.as_table }}
-	</table>
-	<input type="submit"/>
-</form>
-
-
-{% endblock %}
--- a/web/ldt/ldt/templates/admin/ldt/content/upload_form.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-{% extends "admin/ldt/app_action.html" %}
-{# import an ldt #}
-{% block content %}
-<p>Vous pouvez importer un fichier ldt ou un zip qui compresse un fichier .ldt et plusieurs fichiers .iri. </p>
-<p>Bien verifiez vous que le chemin de source est absolute pour un fichier ldt lors qu'il est tout seul, alors qu'il est relatif s'il est dans le zip</p>
-<p>Vous pouvez indiquer le chemin de video si vous avez besoin</p>
-{% if message %}
-<div>
-<p>
-{{ message }}
-</p>
-</div>
-{% endif %}
-
-{% if form %}
-
-<form method="post" enctype="multipart/form-data" action="">
-    {% csrf_token %}
-	<table>
-	{{ form.as_table }}
-	</table>
-	<input type="submit"/>
-</form>
-{% endif %}
-
-<a href="{% url admin:app_list 'ldt' %}" >Back to administration page</a>
-
-{% endblock %}
--- a/web/ldt/ldt/templates/iriuser/ldt/copy_ldt.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-{% load i18n %}
-{# form of copy of project ldt #}
-<!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>
-<link rel="stylesheet" href="{{BASE_URL}}static/ldt/css/ldt.css" />
-</head>
-<body>
-<div id="add_contribution">
- <div class="title">{% trans "Copy your project" %}</div>
-    <form action="" method="POST">        
-        {% csrf_token %}
-        <label for="title">{% trans "Title" %}:</label>
-        <input class= "inputbox required" type="text" name="title" size="80"; value="" id="title" />
-        
-    <input class="button" id="ldt_submit" type="submit" value="{% trans 'Copy' %}"/>
-    </form>
-</div>
-</body>
-</html>
--- a/web/ldt/ldt/templates/iriuser/ldt/create_ldt.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-{% load i18n %}
-{# form of creation of project ldt #}
-<!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>
-<link rel="stylesheet" href="{{BASE_URL}}static/ldt/css/ldt.css" />
-</head>
-<body>
-<div id="add_contribution">
- <div class="title">{% 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" />
-        
-        <div class="title">{% trans "List of contents" %}</div>
-            <ul class='contentlist'>
-                {% for content in contents %}
-                <li><input type="checkbox" name="contents" value="{{ content.id}}" checked="true"/>{{content.iri_id}}</li>
-                {% endfor %}
-            </ul>
-        
-    <input class="button" id="ldt_submit" type="submit" value="{% trans 'Create' %}"/>
-    </form>
-</div>
-</body>
-</html>
--- a/web/ldt/ldt/templates/iriuser/ldt/init_ldt.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-<html>
-  <head>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-	<meta http-equiv="Cache-Control" content="no-cache, must-revalidate" />
-	<meta http-equiv="Pragma" content="no-cache" />
-	<meta http-equiv="Cache" content="no store" />
-	<meta http-equiv="Expires" content="-1" />
-	<title>Ligne de Temps - IRI</title>
-	<script type="text/javascript" src="{{MEDIA_URL}}js/swfobject.js"></script>
-	<script type="text/javascript">
-	    
-	</script>
-  </head>
-
-<body id="init_ldt_view">
-
-  <div id="ldtInit" style="width:1001px;height:631px;">&nbsp;
-  </div>
-  <script language="JavaScript" type="text/javascript">
-
-        var params = {
-            quality:"high",
-            allowFullScreen:"true",
-            wmode:"transparent",
-            allowScriptAccess:"always"
-        };
-    
-        var flashvars = {
-            colorUrl:'{{colorurl}}',
-            i18nUrl: '{{i18nurl}}',
-            language: '{{language}}',
-            {% if url %}
-            urlBase:'{{baseurl}}',
-            initUrl:'{{url}}',
-            {% endif %}
-            {% ifequal readonly 'false' %}
-            readOnly: '{{readonly}}',
-            postUrl:'{{posturl}}',
-            postVars: encodeURIComponent('id={{id}}&csrfmiddlewaretoken={{csrf_token}}'),
-            {% else %}
-            readOnly:'true',
-            {% endifequal %}
-            startTime:'100'     
-        };
-
-        var attributes = {  id: "ldtInitSwf",  name: "ldtInitSwf"};
-
-        swfobject.embedSWF("{{ MEDIA_URL }}swf/ldt/LignesDeTempsFlex.swf", "ldtInit", "1001", "631", "9.0.0", "{{ MEDIA_URL }}swf/expressInstall.swf", flashvars, params, attributes);
-
-    </script>
-</body>
-</html>
--- a/web/ldt/ldt/templates/iriuser/ldt/ldt_list.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-{% extends "ldt/user/user_base.html" %}
-{# list of projects ldt #}
-{% load i18n %}
-{% block js_import %}{{ block.super }}
-<script type="text/javascript" src="{{ BASE_URL }}static/js/jquery.DOMwindow.js"></script>
-<script type="text/javascript">           
-        $(document).ready(function(){
-        	$('.ldt_link').nyroModal({
-        		height:662, 
-        		width:1022, 
-        		type:'iframe',
-        		forceType:'iframe',
-        		padding:5,
-        		bgColor: 'rgb(239, 239, 239)',
-                titleFromIframe: false,
-                beforeHideContent: function(elts, settings, callback){
-                    try {                       
-                        var res = $('#ldtInitSwf',$('#nyroModalIframe').contents());
-                        if(res.length > 0)
-                        {
-                            var swfobj = res.get(0);
-                            if(swfobj && swfobj.forceSave != undefined)          
-                                swfobj.forceSave();
-                        }
-                    }
-                    catch(err)
-                    {
-                        // do nothing
-                    }                   
-                    callback();
-                }        		
-            	});
-            $('.create_ldt_link').nyroModal({
-        		height:662, 
-        		width:1022, 
-        		type:'ajax', 
-        		padding:5,
-        		bgColor: 'rgb(239, 239, 239)',
-            	});       
-        });        	        
-</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 "Ldt Project" %}{% endblock %}
-
-{% block iricontent %}
-<div id='ldtlist'>
-<a href="{% url ldt.ldt.views.create_ldt_view %}" class="create_ldt_link">{% trans 'Create new project'%}</a>
-    <table>
-    <caption>{% trans "Project" %}</caption>
-    <thead>
-        <tr>
-        <th width="170">{% trans "title" %}</th>
-        <th width="20">{% trans " published" %}</th>
-        </tr>
-    </thead>
-    <tbody>
-        {% for ldt in ldtProjects %}    
-        <tr>
-        <th><a href="{% url ldt.ldt.views.indexProject ldt.ldt_id %}" class="ldt_link">{{ ldt.title  }}</a></th>
-        {% ifequal ldt.state 2%}
-        <td><a href ="{% url ldt.ldt.views.unpublish ldt.ldt_id%}"><img alt="True" src="{{BASE_URL}}static/admin/img/admin/icon-yes.gif"/></td>
-        {% else %}
-        <td><a href="{% url ldt.ldt.views.publish ldt.ldt_id %}"><img alt="False" src="{{BASE_URL}}static/admin/img/admin/icon-no.gif"/></td>
-        {% endifequal %}
-        </tr>
-        {% endfor %}
-    </tbody>
-    </table>
-</div>
-{% endblock %}
-
--- a/web/ldt/ldt/templates/iriuser/ldt/loading.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-<!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>
-<style type="text/css">
-    
-    .center{
-        position: absolute;
-        top: 50%;
-        left: 50%;
-    }
-    .center div{
-        position:relative;
-        top: -7px;
-        left: -104px;
-    }
-</style>
-</head>
-<body>
-<div class="center">
-<div>
-<img alt="loading" src="{{MEDIA_URL}}img/loadingAnimation.gif" />
-</div>
-</div>
-</body>
-</html>
--- a/web/ldt/ldt/templates/iriuser/ldt/save_done.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-<p>done</p>
-<p>{{ldt}}<p>
-<p>{{id}}</p>
-<p>title:{{title}}</p>
\ No newline at end of file
--- a/web/ldt/ldt/tests.py	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-"""
-This file demonstrates two different styles of tests (one doctest and one
-unittest). These will both pass when you run "manage.py test".
-
-Replace these with more appropriate tests for your application.
-"""
-
-from django.test import TestCase
-
-class SimpleTest(TestCase):
-    def test_basic_addition(self):
-        """
-        Tests that 1 + 1 always equals 2.
-        """
-        self.failUnlessEqual(1 + 1, 2)
-
-__test__ = {"doctest": """
-Another way to test that 1 + 1 is equal to 2.
-
->>> 1 + 1 == 2
-True
-"""}
-
--- a/web/ldt/ldt/urls.py	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-from django.conf.urls.defaults import *
-from ldt.management import test_ldt
-
-# Uncomment the next two lines to enable the admin:
-# from django.contrib import admin
-# admin.autodiscover()
-
-urlpatterns = patterns('ldt.ldt',
-    url(r'^searchInit/(?P<field>.*)/(?P<query>.*)$', 'views.searchInit'),
-    url(r'^searchForm/$', 'views.searchForm'),
-    url(r'^search/$', 'views.searchIndex'),
-    url(r'^search/(?P<field>.*)/(?P<query>.*)$', 'views.searchIndexGet'),
-    url(r'^searchLdt/(?P<field>.*)/(?P<query>.*)$', 'views.searchLdt'),
-    url(r'^searchSeg/(?P<field>.*)/(?P<query>.*)$', 'views.searchSegments'),
-    url(r'^index/(?P<url>.*)$', 'views.index'),
-    url(r'^init/(?P<method>.*)/(?P<url>.*)$', 'views.init'),
-    url(r'^ldt/(?P<url>.*)$', 'views.ldt'),
-    url(r'^search/loading/$', 'views.loading'),
-    url(r'^create/(?P<iri_id>.*)$', 'views.create_project'),
-    url(r'^copy/(?P<ldt_id>.*)$', 'views.copy_project'),
-)
-
-if test_ldt():
-    urlpatterns += patterns('ldt.ldt',
-        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'),
-        url(r'^space/ldt/project/(?P<id>.*)$', 'views.ldtProject'),
-        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'),
-
-)
--- a/web/ldt/ldt/utils.py	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,266 +0,0 @@
-import lucene
-from ldt.ldt import STORE
-from ldt.ldt import ANALYZER
-from Ft.Xml import MarkupWriter
-import uuid
-import django.core.urlresolvers
-from django.conf import settings
-import urllib
-import xml.dom
-import xml.dom.minidom
-import xml.dom.ext
-import xml.xpath
-import os
-import os.path
-
-class LdtSearch(object):
-
-    def query(self, field, query):
-        indexSearcher = lucene.IndexSearcher(STORE)
-        queryParser = lucene.QueryParser(field, lucene.FrenchAnalyzer())
-        queryParser.setDefaultOperator(lucene.QueryParser.Operator.AND)
-        queryObj = queryParser.parse(query)
-        hits = indexSearcher.search(queryObj)
-	
-        res = []
-        for hit in hits:
-            doc = lucene.Hit.cast_(hit).getDocument()
-        res.append({"iri_id":doc.get("iri_id"),"ensemble_id":doc.get("ensemble_id"),"decoupage_id":doc.get("decoupage_id"), "element_id":doc.get("element_id")})
-        return res
-
-    def queryAll(self, query):		
-        return self.query("all", query)
-
-class LdtUtils(object):
-    
-    def generateLdt(self, contentList, file, title = u"", author=u"IRI Web", web_url=u"", media_url="", startSegment = None, contributions=None):
-
-        writer = MarkupWriter(file, indent = u"yes")
-        writer.startDocument()
-        writer.startElement(u"iri")
-        writer.simpleElement(u"project", attributes={u"id":unicode(str(uuid.uuid1())), u"title":unicode(title) , u"user":author, u"abstract":u""})
-        writer.startElement(u"medias")
-        for content in contentList:
-            videopath = unicode(settings.STREAM_URL)
-            if content.videopath :
-                videopath = unicode(content.videopath)
-            writer.simpleElement(u"media", attributes={u"id":content.iri_id,u"src":content.iri_url(web_url),u"video":videopath,u"pict":u"",u"extra":u""})
-        writer.endElement(u"medias")
-
-        if contributions is None:
-            contributions = []
-        annotations_nodes = {}
-        for contrib in contributions:
-            doc = xml.dom.minidom.parseString(contrib.ldtproject.ldt.encode("utf-8"))
-            con = xml.xpath.Context.Context(doc, 1, 1, None)
-            res = xml.xpath.Evaluate("/iri/annotations/content", context=con)
-            for content in res:
-                contentid = content.getAttribute("id")
-                if annotations_nodes.has_key(contentid):
-                    contentnode = annotations_nodes[contentid]
-                else:
-                    contentnode = {"id":contentid, "ensembles":[]}
-                    annotations_nodes[contentid]=contentnode
-                for ens in content.childNodes:
-                    if ens.nodeType == xml.dom.Node.ELEMENT_NODE and ens.tagName.endswith("ensemble"):
-                        contentnode["ensembles"].append(ens.toprettyxml())
-
-        if len(annotations_nodes) > 0:
-            writer.startElement(u"annotations")
-            for content in contentList:
-                if content.content_base.iri_id in annotations_nodes:
-                    contentnode = annotations_nodes[content.content_base.iri_id]
-                    if contentnode is not None:
-                        if len(contentnode["ensembles"])>0:
-                            writer.startElement(u"content", attributes={"id":contentnode["id"]})
-                            writer.text(u"")
-                            for ens in contentnode["ensembles"]:
-                                writer.xmlFragment(ens.encode("utf-8"))
-                            writer.endElement(u"content")
-                        else:
-                            writer.simpleElement(u"content", attributes={"id":contentnode["id"]})
-            writer.endElement(u"annotations")
-        else:
-            writer.simpleElement(u"annotations")
-
-
-        writer.startElement(u"displays")
-        if len(contentList) > 0:
-            writer.startElement(u"display", attributes={u"id":u"0",u"title":u"generated",u"idsel":contentList[0].iri_id,u"tc":u"0"})
-            for content in contentList:
-                writer.startElement(u"content", attributes={u"id":content.iri_id})
-                filepath = urllib.urlopen(content.iri_url())
-                doc = xml.dom.minidom.parse(filepath)
-                con = xml.xpath.Context.Context(doc, 1, 1, None)
-                res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble/decoupage", context=con)
-                for decoupagenode in res:
-                    decoupage_id = decoupagenode.getAttribute(u"id")
-                    ensemble_id = decoupagenode.parentNode.getAttribute(u"id")
-                    writer.simpleElement(u"decoupage", attributes={u"id":decoupage_id,u"idens":ensemble_id})
-                writer.endElement(u"content")
-            if startSegment is not None:
-                writer.startElement(u"activeSegment")
-                writer.simpleElement(u"id",attributes={u"idctt" : startSegment["idcontent"],u"idens" : startSegment["idgroup"], u"idcut" : startSegment["idcutting"], u"idseg" : startSegment["idsegment"]})
-                writer.endElement(u"activeSegment")
-
-            writer.endElement(u"display")
-        writer.endElement(u"displays")
-        writer.simpleElement(u"edits")
-        writer.endElement(u"iri")
-
-    def generateInit(self, url, method, search=None):
-        
-        import xml.dom
-        import xml.dom.ext
-    
-        impl = xml.dom.getDOMImplementation()
-        doc = impl.createDocument(xml.dom.EMPTY_NAMESPACE, 'iri', None)
-    
-        elementFiles = doc.createElement('files')
-        doc.documentElement.appendChild(elementFiles)
-    
-        elementInit = doc.createElement('init')
-        elementFiles.appendChild(elementInit)
-    
-        elementfile = doc.createElement('file')
-            
-        elementfile.setAttribute('src',settings.WEB_URL + django.core.urlresolvers.reverse(method, args=url))
-        elementfile.setAttribute('display', '1')
-        if(search):
-            elementfile.setAttribute("segsel",settings.WEB_URL + django.core.urlresolvers.reverse(search, args=url))
-    
-    
-        # /*chemin video : tant que le serveur de media n'est pas up, */
-        elementfile.setAttribute('video', settings.STREAM_URL)
-        elementfile.setAttribute('pict', "")
-        elementfile.setAttribute('extra', "")
-    
-        elementInit.appendChild(elementfile);
-    
-        elementRecent = doc.createElement('recent');
-        elementFiles.appendChild(elementRecent);
-    
-    
-        elementLibrary = doc.createElement('library');
-        elementFiles.appendChild(elementLibrary);
-    
-        username = ''
-        id = ''
-        elementUser = doc.createElement('user')
-        elementUser.setAttribute('name', username)
-        elementUser.setAttribute('id', id)
-        doc.documentElement.appendChild(elementUser)
-        
-        return doc
-
-def create_ldt(project, user):
-    
-    contentList=project.contents.all()
-    
-    """create xml"""
-    
-    # create a dom
-    impl = xml.dom.getDOMImplementation()
-    dom = impl.createDocument(xml.dom.EMPTY_NAMESPACE, 'iri', None)
-    #node project
-    elementProject = dom.createElement('project')
-    dom.documentElement.appendChild(elementProject)
-    
-    
-    elementProject.setAttribute('abstract', "")
-    elementProject.setAttribute('title', project.title)
-    elementProject.setAttribute('user', user.username)
-    elementProject.setAttribute('id', project.ldt_id)
-    #node medias
-    elementMedias = dom.createElement('medias')
-    dom.documentElement.appendChild(elementMedias)
-    
-    idsel = None      
-    for content in contentList:
-        if not idsel:
-            idsel = content.iri_id
-        elementMedia = dom.createElement('media')            
-        elementMedia.setAttribute('id', content.iri_id)
-        elementMedia.setAttribute('src', content.iri_url())
-        if content.videopath and content.videopath !="":
-            elementMedia.setAttribute('video', content.videopath)
-        else:
-            elementMedia.setAttribute('video', settings.STREAM_URL)
-        elementMedia.setAttribute('pict', "")
-        elementMedia.setAttribute('extra', "")
-        elementMedias.appendChild(elementMedia)
-    if not idsel:
-        idsel = ""
-
-    #node annotations
-    elementAnnotations = dom.createElement('annotations')
-    dom.documentElement.appendChild(elementAnnotations)
-    #node displays
-    elementDisplays = dom.createElement('displays')
-    elementDisplay = dom.createElement('display')
-    elementDisplay.setAttribute('id', '0')
-    elementDisplay.setAttribute('title', 'Init view')
-    elementDisplay.setAttribute('idsel', idsel)
-    elementDisplay.setAttribute('tc', '0')
-    elementDisplay.setAttribute('zoom', '0')
-    elementDisplay.setAttribute('scroll', '0')
-    elementDisplay.setAttribute('infoBAB', '')
-    #node content
-    for content in contentList:
-        elementContent = dom.createElement('content')
-        elementContent.setAttribute('id', content.iri_id)
-        if not 'http' in content.iriurl:
-        #eg: "iiiielizabethrosse/ENMI08-III_elizabethrosse.iri"
-            url = content.iri_url()
-        else:
-            url =content.iriurl
-        file = urllib.urlopen(url)
-        doc = xml.dom.minidom.parse(file)
-        con = xml.xpath.Context.Context(doc, 1, 1, None)
-        res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble/decoupage", context=con)
-        #node decoupage
-        for decoupagenode in res:
-            decoupage_id = decoupagenode.getAttribute(u"id")
-            ensemble_id = decoupagenode.parentNode.getAttribute(u"id")
-            elementDecoupage = dom.createElement('decoupage')
-            elementDecoupage.setAttribute('idens', ensemble_id)
-            elementDecoupage.setAttribute('id', decoupage_id)
-            elementContent.appendChild(elementDecoupage)     
-        elementDisplay.appendChild(elementContent)   
-    
-    elementDisplays.appendChild(elementDisplay)
-    dom.documentElement.appendChild(elementDisplays)
-    
-    elementEdits = dom.createElement('edits')
-    dom.documentElement.appendChild(elementEdits)
-    # write dom in Project.ldt 
-    project.ldt = dom.documentElement.toprettyxml()
-    #save Project
-    project.save()
-    return project        
-
-
-def copy_ldt(project, new_project, user):
-    new_project.ldt_id = str(uuid.uuid1())
-    new_project.created_by=user.username
-    new_project.changed_by=user.username
-    new_project.state = 1
-    
-    contentList=project.contents.all()
-    
-    """create xml"""
-    
-    # create a dom
-    dom = xml.dom.minidom.parseString(project.ldt.encode("utf-8"))
-    con = xml.xpath.Context.Context(dom, 1, 1, None)
-    res = xml.xpath.Evaluate("iri/project", context=con)
-    for elementProject in res:
-        elementProject.setAttribute('abstract', "")
-        elementProject.setAttribute('title', new_project.title)
-        elementProject.setAttribute('user', user.username)
-        elementProject.setAttribute('id', new_project.ldt_id)
-        
-    new_project.ldt = dom.documentElement.toprettyxml()
-    #save Project
-    new_project.save()
-    return new_project        
--- a/web/ldt/ldt/views.py	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,287 +0,0 @@
-import django.core.urlresolvers
-from django.http import HttpResponse, HttpResponseRedirect
-from django.shortcuts import render_to_response, get_object_or_404
-from django.template import RequestContext
-from django.core.urlresolvers import reverse
-from django.contrib.auth.decorators import login_required
-from django.conf import settings
-from fileimport import *
-from forms import LdtImportForm, LdtAddForm, SearchForm, AddProjectForm, CopyProjectForm
-from ldt.core.models import Owner
-from models import *
-from utils import *
-from contentindexer import *
-from string import Template
-from Ft.Xml import MarkupWriter
-import cgi
-import uuid
-import base64
-import lucene
-import xml.dom
-import xml.dom.ext
-import xml.dom.minidom
-
-
-    
-def searchForm(request):
-    form = SearchForm()
-    return render_to_response('ldt/ldt/search_form.html',{'form': form} , context_instance=RequestContext(request))    
-
-def searchIndex(request):
-    
-    sform = SearchForm(request.POST)
-    if sform.is_valid():
-        search = sform.cleaned_data["search"]
-    
-    
-        queryStr = base64.urlsafe_b64encode(search.encode('utf8'))
-        field = request.POST["field"]
-        language_code = request.LANGUAGE_CODE[:2]
-    
-        url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt.views.searchInit", args=[field, queryStr])
-        return render_to_response('ldt/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': url}, context_instance=RequestContext(request))
-    else:
-        resp = HttpResponse()
-        resp.write("<html><head></head><body>Error : No result</body></html>");
-
-def searchIndexGet(request, field, query):
-
-    language_code = request.LANGUAGE_CODE[:2]
-    url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt.views.searchInit", args=[field, query])
-    return render_to_response('irisuser/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': url}, context_instance=RequestContext(request))
-
-def searchInit(request, field, query):
-    
-    ldtgen = LdtUtils()
-    
-    doc = ldtgen.generateInit([field,query], 'ldt.ldt.views.searchLdt', 'ldt.ldt.views.searchSegments')
-    
-    resp = HttpResponse(mimetype="text/xml;charset=utf-8")
-    xml.dom.ext.PrettyPrint(doc, resp)
-    return resp
-
-def searchLdt(request, field, query, edition=None):
-    
-    contentList = []
-    resp = HttpResponse(mimetype="text/xml")
-    queryStr = ""
-
-    if query and len(query)>0:        
-        queryStr = base64.urlsafe_b64decode(query.encode("ascii")).decode("utf8")
-        searcher = LdtSearch()
-        ids = {}
-        
-        for result in searcher.query(field, queryStr):
-            ids[result["iri_id"]] = ""            
-
-        id_list = ids.keys()
-        
-        if edition is not None:
-            ids_editions = map(lambda t:t[0], filter(lambda id: id[0] is not None, Speak.objects.filter(session__day__edition=edition).order_by("session__start_ts", "order").values_list("content__iri_id")))            
-            id_list = filter(lambda id: id in id_list, ids_editions)
-            
-        contentList = Content.objects.filter(iri_id__in=id_list)        
-
-            
-    ldtgen = LdtUtils()
-    ldtgen.generateLdt(contentList, file=resp, title = u"Recherche : " + queryStr)
-    
-    return resp
-
-
-def searchSegments(request, field, query, edition=None):
-    
-    if query and len(query)>0:
-        searcher = LdtSearch()
-        
-        queryStr = base64.urlsafe_b64decode(query.encode("ascii")).decode("utf8")
-        res = searcher.query(field, queryStr)
-    else:
-        res = []
-        
-    iri_ids = None
-    
-    if edition is not None:
-        iri_ids = map(lambda t:t[0], filter(lambda id: id[0] is not None, Speak.objects.filter(session__day__edition=edition).order_by("session__start_ts", "order").values_list("content__iri_id")))
-
-    doc = xml.dom.getDOMImplementation().createDocument(None, "iri", None)
-
-    for resultMap in res:
-        if iri_ids is None or resultMap['iri_id'] in iri_ids:
-            elem = doc.createElement('seg')
-            elem.setAttribute('idctt', resultMap['iri_id'])
-            elem.setAttribute('idens', resultMap['ensemble_id'])
-            elem.setAttribute('iddec', resultMap['decoupage_id'])
-            elem.setAttribute('idseg', resultMap['element_id'])
-            elem.setAttribute('idvue', "")
-            elem.setAttribute('crit', "")
-            doc.documentElement.appendChild(elem)
-
-    return HttpResponse(doc.toprettyxml(encoding='utf-8'), mimetype="text/xml;charset=utf-8")
-    
-@login_required         
-def list_ldt(request):
-    contents = Content.objects.all()
-    try:
-        owner = Owner.objects.get(user=request.user)
-    except:
-        return HttpResponseRedirect(settings.LOGIN_URL)
-    ldtProjects = Project.objects.filter(owner=owner)
-    context={
-    'contents': contents,
-    'ldtProjects': ldtProjects.reverse(),
-    }
-    return render_to_response('ldt/ldt/ldt_list.html', context, context_instance=RequestContext(request))
-
-def create_ldt_view(request):
-    if request.method == "POST" :
-        form = LdtAddForm(request.POST)
-        if form.is_valid():
-            user = request.user
-            Project.create_project(title=form.cleaned_data['title'], user=user, contents=form.cleaned_data['contents'])
-            return HttpResponseRedirect(reverse("ldt.ldt.views.list_ldt"))
-    else:
-        form = LdtAddForm()
-        contents = Content.objects.all()    
-        return render_to_response('ldt/ldt/create_ldt.html', {'contents': contents, 'form': form,'create_project_action':reverse(create_ldt_view)}, context_instance=RequestContext(request))
-     
-def created_ldt(request):
-    return render_to_response('ldt/ldt/done.html', context_instance=RequestContext(request))
-    
-def indexProject(request, id):
-
-    urlStr = settings.WEB_URL + reverse("ldt.ldt.views.init", args=['ldtProject', id])
-    posturl= settings.WEB_URL + reverse("ldt.ldt.views.save_ldtProject")
-    language_code = request.LANGUAGE_CODE[:2]
-    
-    ldt = get_object_or_404(Project, ldt_id=id)
-    if ldt.state ==2: #published
-        readonly = 'true'
-    else:
-        readonly = 'false'
-    
-    return render_to_response('ldt/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': urlStr, 'posturl': posturl, 'id': id, 'readonly': readonly}, context_instance=RequestContext(request))
-    
-def init(request, method, url):
-    ldtgen = LdtUtils()
-
-    doc = ldtgen.generateInit([url], 'ldt.ldt.views.'+method, None)
-
-    resp = HttpResponse(mimetype="text/xml")
-    resp['Cache-Control']='no-cache, must-revalidate'
-    resp['Pragma']='no-cache'
-    xml.dom.ext.PrettyPrint(doc, resp)
-    return resp
-       
-def ldtProject(request, id):
-    resp = HttpResponse(mimetype="text/xml")
-    resp['Cache-Control']='no-cache, must-revalidate'
-    resp['Pragma']='no-cache'
-    
-    project = Project.objects.get(ldt_id=id)
-    resp.write(project.ldt)
-    return resp
-
-def save_ldtProject(request):
-    if request.method=="POST":
-        ldt = request.POST['ldt']
-        id = request.POST['id']
-        ldtproject=Project.objects.get(ldt_id=id)
-        #save xml ldt
-        ldtproject.ldt=ldt
-        #get new title
-        dom = xml.dom.minidom.parseString(ldt.encode( "utf-8" ))
-        con = xml.xpath.Context.Context(dom, 1, 1, None)
-        result = xml.xpath.Evaluate("/iri/project",context=con)
-        for pnode in result:
-            title=pnode.getAttribute("title")
-            break
-        #set new title
-        ldtproject.title=title
-        #get new content list
-        new_contents=[]
-        result = xml.xpath.Evaluate("/iri/medias/media", context=con)
-        for medianode in result:
-            id = medianode.attributes['id'].value
-            new_contents.append(id)
-        # set new content list
-        for c in ldtproject.contents.all():
-            if not c.iri_id in new_contents:
-                ldtproject.contents.remove(c)           
-        ldtproject.save()
-    else:
-        ldt = ''
-    return render_to_response('ldt/ldt/save_done.html', {'ldt': ldt, 'id':id, 'title':title, 'contents': new_contents}, context_instance=RequestContext(request))
-    
-@login_required    
-def publish(request, id):
-    ldt = get_object_or_404(Project, ldt_id=id)
-    ldt.state = 2 #published
-    ldt.save()
-    return HttpResponseRedirect(reverse("ldt.ldt.views.list_ldt"))
-    
-@login_required    
-def unpublish(request, id):
-    ldt = get_object_or_404(Project, ldt_id=id)
-    ldt.state = 1 #edition
-    ldt.save()
-    return HttpResponseRedirect(reverse("ldt.ldt.views.list_ldt"))
-    
-
-def index(request, url):
-    
-    urlStr = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt.views.init", args=['ldt',url])
-    language_code = request.LANGUAGE_CODE[:2]
-    
-    return render_to_response('ldt/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': urlStr, 'weburl':settings.WEB_URL+settings.BASE_URL}, context_instance=RequestContext(request))
-
-
-def ldt(request, url, startSegment = None):
-
-    import Ft
-    from Ft.Xml import MarkupWriter
-    
-    resp = HttpResponse(mimetype="text/xml; charset=utf-8")
-    resp['Cache-Control'] = 'no-cache'
-
-    contentList = Content.objects.filter(iri_id=url)
-
-    ldtgen = LdtUtils()
-    ldtgen.generateLdt(contentList, file=resp, title = contentList[0].title, startSegment=startSegment)
-
-    return resp
-
-
-def loading(request):
-     return render_to_response('ldt/ldt/loading.html', context_instance=RequestContext(request))
-
-
-@login_required
-def create_project(request, iri_id):
-
-    content = get_object_or_404(Content, iri_id=iri_id)
-    contents = [ content, ]
-    if request.method == "POST" :
-        form = AddProjectForm(request.POST)
-        if form.is_valid():
-            user=request.user
-            project = Project.create_project(title=form.cleaned_data['title'], user=user, contents=contents)
-            return HttpResponseRedirect(reverse('ldt.ldt.views.indexProject', args=[project.ldt_id]))
-    else:
-        form = AddProjectForm()
-    return render_to_response('ldt/ldt/create_ldt.html', {'form':form, 'contents':contents, 'iri_id':iri_id, 'create_project_action':reverse("ldt.ldt.views.create_project",args=[iri_id])}, context_instance=RequestContext(request))
-
-@login_required
-def copy_project(request, ldt_id):
-
-    project = get_object_or_404(Project, ldt_id=ldt_id)
-    if request.method == "POST" :
-        form = CopyProjectForm(request.POST)
-        if form.is_valid():
-            user=request.user
-            project = project.copy_project(title=request.POST['title'], user=user)
-            return HttpResponseRedirect(reverse('ldt.ldt.views.indexProject', args=[project.ldt_id]))
-    else:
-        form = CopyProjectForm
-    return render_to_response('ldt/ldt/copy_ldt.html', {'form':form, 'project':project}, context_instance=RequestContext(request))
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/__init__.py	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,15 @@
+import lucene
+from django.conf import settings
+
+lucene.initVM(lucene.CLASSPATH)
+
+STORE = lucene.SimpleFSDirectory(lucene.File(settings.INDEX_PATH))
+ANALYZER = lucene.PerFieldAnalyzerWrapper(lucene.StandardAnalyzer(lucene.Version.LUCENE_CURRENT))
+ANALYZER.addAnalyzer("tags",lucene.FrenchAnalyzer(lucene.Version.LUCENE_CURRENT))
+ANALYZER.addAnalyzer("title",lucene.FrenchAnalyzer(lucene.Version.LUCENE_CURRENT))
+ANALYZER.addAnalyzer("abstract",lucene.FrenchAnalyzer(lucene.Version.LUCENE_CURRENT))
+ANALYZER.addAnalyzer("all",lucene.FrenchAnalyzer(lucene.Version.LUCENE_CURRENT))
+
+
+VERSION  = (0,1)
+VERSION_STR = unicode(".".join(map(lambda i:"%02d" % (i,), VERSION)))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/admin.py	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,81 @@
+from django.contrib import admin
+from django.conf.urls.defaults import *
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+from django.conf import settings
+from models import *
+from forms import *
+from fileimport import *
+from ldt.ldt_utils import STORE
+from ldt.ldt_utils import ANALYZER
+
+import lucene
+
+admin.site.register(Project)
+
+class ContentAdmin(admin.ModelAdmin):
+    
+    def import_file(self, request):
+        if request.method =='POST':
+            form = LdtImportForm(request.POST, request.FILES)
+            if form.is_valid():
+                filetoprocess =form.cleaned_data['importFile']
+                flatten = form.cleaned_data['flatten']
+                videoPath = form.cleaned_data['videoPath']
+                # fi = None
+                fi = FileImport(filetoprocess, videoPath, flatten)
+                try:
+                    fi.processFile()
+                    args = {'message': "File imported"}
+                except FileImportError:
+                    non_field_errors = form.non_field_errors()
+                    non_field_errors.append("Error when importing : unknown file type")
+                    form._errors["__all__"] = non_field_errors
+                    args = {'message': "Can not import file, unknown file type", 'form': form}
+                    
+            else:
+                non_field_errors = form.non_field_errors()
+                non_field_errors.append("Error when importing : invalid form")
+                form._errors["__all__"] = non_field_errors
+                args = {'message': "Error when importing : invalid form", 'form': form}
+        else:
+            form = LdtImportForm()
+            args = {'form': form, 'current_app': self.admin_site.name, 'current_action' : 'import_file'}
+        return render_to_response('admin/ldt_utils/content/upload_form.html', args, context_instance=RequestContext(request))
+
+    def reindex(self, request):
+        message = None
+        if request.method == "POST":
+            form = ReindexForm(request.POST)
+            if form.is_valid():    
+                # try:
+                writer = lucene.IndexWriter(STORE, ANALYZER, True, lucene.IndexWriter.MaxFieldLength.UNLIMITED)
+                contentList = form.cleaned_data["contents"]
+                indexer = ContentIndexer(contentList,writer)
+                indexer.index_all()
+
+                writer.close()
+                message = "Indexation ok : " + repr(form.cleaned_data["contents"]) 
+                form = ReindexForm()
+                # except Exception, inst:
+                    # non_field_errors = form.non_field_errors()
+                    # non_field_errors.append("Error when reindexing : " + cgi.escape(repr(inst)))
+                    # form._errors["__all__"] = non_field_errors
+                    #message = "ERROR : " + repr(non_field_errors)
+        else:
+            form = ReindexForm()
+    
+        return render_to_response('admin/ldt_utils/content/reindex_form.html', {'form': form, 'message':message, 'current_app': self.admin_site.name, 'current_action' : 'reindex' }, context_instance=RequestContext(request))
+
+    def get_urls(self):
+        urls = super(ContentAdmin, self).get_urls()
+        content_urls = patterns('',
+            url(r'^reindex/$', self.admin_site.admin_view(self.reindex), name="ldt_content_reindex"),
+    # (r'^admin/ldt/content/import/upload/$', 'ldt.ldt_utils.views.uploadFile'),                                
+            url(r'^import/$', self.admin_site.admin_view(self.import_file), name="ldt_content_import_file")
+        )
+        return content_urls + urls
+
+
+admin.site.register(Content, ContentAdmin)
+admin.site.register(Author)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/contentindexer.py	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,238 @@
+import tempfile
+import os
+import os.path
+import shutil
+from ldt.utils import zipfileext
+import urllib
+# import ldt.utils.log
+import ldt.utils.xml
+from django.conf import settings
+from models import Content
+import xml
+import xml.dom
+import xml.dom.minidom
+import xml.dom.ext
+import xml.xpath
+import fnmatch
+import Ft
+import uuid
+import shutil
+import lucene
+from ldt.ldt_utils import STORE
+from ldt.ldt_utils import ANALYZER
+
+def Property(func):
+    return property(**func()) 
+
+
+class ContentIndexer(object):
+        
+        def __init__(self, contentList, writer, decoupage_blackList = settings.DECOUPAGE_BLACKLIST):
+                self.__contentList = contentList
+                self.__decoupage_blacklist = decoupage_blackList
+                self.__writer = writer
+                    
+        @Property
+        def decoupage_blacklist(): #@NoSelf
+            doc = """get blacklist""" #@UnusedVariable
+           
+            def fget(self):
+                if self.__decoupage_blacklist is None:
+                    self.__decoupage_blacklist = ()
+                return self.__decoupage_blacklist
+               
+            def fset(self, value):
+                self.__decoupage_blacklist = value
+               
+            def fdel(self):
+                del self.__decoupage_blacklist
+               
+            return locals()
+                   
+        def index_all(self):
+            for content in self.__contentList:
+                self.index_content(content)
+                
+        def index_content(self, content):
+            url =content.iri_url()
+            filepath = urllib.urlopen(url)
+            doc = xml.dom.minidom.parse(filepath)
+            doc = Ft.Xml.Domlette.ConvertDocument(doc)
+                                   
+            self.__writer.deleteDocuments(lucene.Term("iri_id", content.iri_id))
+            
+            con = xml.xpath.Context.Context(doc, 1, 1, None)
+            res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble", context=con)
+
+            for ensemble in res:
+                ensembleId = ensemble.getAttributeNS(None,u"id")
+                
+                for decoupageNode in ensemble.childNodes:
+                    if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage"  or decoupageNode.getAttributeNS(None,u"id") in self.decoupage_blacklist:
+                        continue
+                    
+                    decoupId = decoupageNode.getAttributeNS(None,u"id")
+                    res = xml.xpath.Evaluate("elements/element", decoupageNode)
+                    for elementNode in res:
+                        doc = lucene.Document()
+                        elementId = elementNode.getAttributeNS(None,u"id")
+                        tags = elementNode.getAttributeNS(None,u"tags")
+                        
+                        if tags is not None:                            
+                            tags.replace(",", ";")
+                        
+                        if tags is None or len(tags) == 0:
+                            tags = ""
+                            restagnode = xml.xpath.Evaluate("tag/text()", elementNode)
+                            for tagnode in restagnode:
+                                tags = tags + " ; " + tagnode.data
+                                
+                        if tags is None or len(tags) == 0:
+                            tags = ""
+                            restagnode = xml.xpath.Evaluate("tags/tag/text()", elementNode)
+                            for tagnode in restagnode:
+                                tags = tags + " ; " + tagnode.data                            
+    
+                        title = ""
+                        for txtRes in xml.xpath.Evaluate("title/text()", elementNode): 
+                            title = title + txtRes.data 
+                
+                        abstract = ""
+                        for txtRes in xml.xpath.Evaluate("abstract/text()", elementNode): 
+                            abstract = abstract + txtRes.data 
+                
+                        doc.add(lucene.Field("iri_id", content.iri_id, lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED))
+                        doc.add(lucene.Field("ensemble_id", ensembleId, lucene.Field.Store.YES, lucene.Field.Index.NO))
+                        doc.add(lucene.Field("decoupage_id", decoupId, lucene.Field.Store.YES, lucene.Field.Index.NO))
+                        doc.add(lucene.Field("element_id", elementId, lucene.Field.Store.YES, lucene.Field.Index.NO))                        
+                        doc.add(lucene.Field("tags", tags, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
+                        doc.add(lucene.Field("title", title, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
+                        doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
+                        doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
+
+                        seg = Segment(content=content,
+                                      iri_id=content.iri_id,
+                                      ensemble_id=ensembleId,
+                                      cutting_id=decoupId,
+                                      element_id=elementId,
+                                      tags=tags,
+                                      title=title,
+                                      abstract=abstract,
+                                      duration=duration,
+                                      author=author,
+                                      start_ts=start_ts,
+                                      date=date_str)
+                        seg.save()
+
+            
+                        self.__writer.addDocument(doc)
+            
+            self.__writer.commit()
+            
+            
+class ProjectIndexer(object):
+        
+        def __init__(self, projectList, writer, decoupage_blackList = settings.DECOUPAGE_BLACKLIST):
+                self.__projectList = projectList
+                self.__decoupage_blacklist = decoupage_blackList
+                self.__writer = writer
+                
+        @Property
+        def decoupage_blacklist(): #@NoSelf
+            doc = """get blacklist""" #@UnusedVariable
+           
+            def fget(self):
+                if self.__decoupage_blacklist is None:
+                    self.__decoupage_blacklist = ()
+                return self.__decoupage_blacklist
+               
+            def fset(self, value):
+                self.__decoupage_blacklist = value
+               
+            def fdel(self):
+                del self.__decoupage_blacklist
+               
+            return locals()
+                   
+        def index_all(self):
+            for project in self.__projectList:
+                self.index_project(project)
+ 
+        def index_project(self, project):
+            
+            # pocketfilms.utils.log.debug("Indexing project : "+str(project.iri_id))
+            doc = xml.dom.minidom.parseString(project.ldt)
+            doc = Ft.Xml.Domlette.ConvertDocument(doc) 
+
+            self.__writer.deleteDocuments(lucene.Term("iri_id", project.iri_id))
+            
+            con = xml.xpath.Context.Context(doc, 1, 1, None)
+            res = xml.xpath.Evaluate("/iri/annotations/content", context=con)
+
+            for content in res:
+                contentId = content.getAttributeNS(None,u"id")
+                
+                ensembleId = "ens_perso"
+                
+                for decoupageNode in content.childNodes:
+                    # pocketfilms.utils.log.debug("Indexing content decoupage : "+ repr(decoupageNode.nodeType) + " in " + repr(self.decoupage_blacklist))
+                    if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage"  or decoupageNode.getAttributeNS(None,"id") in self.decoupage_blacklist:
+                        continue
+                    
+                    decoupId = decoupageNode.getAttributeNS(None,u"id")
+                    res = xml.xpath.Evaluate("elements/element", decoupageNode)
+                    for elementNode in res:
+                        doc = lucene.Document()
+                        elementId = elementNode.getAttributeNS(None,u"id")
+                        tags = elementNode.getAttributeNS(None,u"tags")
+                        
+                        if tags is not None:                            
+                            tags.replace(",", ";")
+                        
+                        if tags is None or len(tags) == 0:
+                            tags = ""
+                            restagnode = xml.xpath.Evaluate("tag/text()", elementNode)
+                            for tagnode in restagnode:
+                                tags = tags + " ; " + tagnode.data
+                                
+                        if tags is None or len(tags) == 0:
+                            tags = ""
+                            restagnode = xml.xpath.Evaluate("tags/tag/text()", elementNode)
+                            for tagnode in restagnode:
+                                tags = tags + " ; " + tagnode.data                            
+    
+                        title = ""
+                        for txtRes in xml.xpath.Evaluate("title/text()", elementNode): 
+                            title = title + txtRes.data 
+                
+                        abstract = ""
+                        for txtRes in xml.xpath.Evaluate("abstract/text()", elementNode): 
+                            abstract = abstract + txtRes.data 
+                
+                        doc.add(lucene.Field("project_id", project.iri_id, lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED))              
+                        doc.add(lucene.Field("iri_id", contentId, lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED))
+                        doc.add(lucene.Field("ensemble_id", ensembleId, lucene.Field.Store.YES, lucene.Field.Index.NO))
+                        doc.add(lucene.Field("decoupage_id", decoupId, lucene.Field.Store.YES, lucene.Field.Index.NO))
+                        doc.add(lucene.Field("element_id", elementId, lucene.Field.Store.YES, lucene.Field.Index.NO))
+                        doc.add(lucene.Field("tags", tags, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
+                        doc.add(lucene.Field("title", title, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
+                        doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
+                        doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
+                        
+                        seg = Segment(content=content,
+                                      iri_id=content.iri_id,
+                                      ensemble_id=ensembleId,
+                                      cutting_id=decoupId,
+                                      element_id=elementId,
+                                      tags=tags,
+                                      title=title,
+                                      abstract=abstract,
+                                      duration=duration,
+                                      author=author,
+                                      start_ts=start_ts,
+                                      date=date_str)
+                        seg.save()
+                                    
+                        self.__writer.addDocument(doc)
+            
+            self.__writer.commit()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/fileimport.py	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,379 @@
+import tempfile
+import os.path
+import shutil
+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 uuid
+import urllib
+
+class FileImportError(Exception):
+    def __init__(self, value):
+        self.value = value
+    def __str__(self):
+        return repr(self.value)
+
+
+def Property(func):
+    return property(**func()) 
+
+class IriInfo(object):
+
+    
+    def __init__(self, id, order, titledesc, basepath="", videopath=settings.STREAM_URL, decoupage_blacklist = settings.DECOUPAGE_BLACKLIST, flatten = True):
+        self.id = id
+        self.basepath = basepath
+        self.order = order
+        self.src = ""
+        self.annotations = None
+        self.videopath = videopath
+        self.videourl = ""
+        self.title = None
+        self.desc = None
+        self.duration = None
+        self.created = False
+        self.content = None
+        self.decoupage_blacklist = decoupage_blacklist
+        if self.decoupage_blacklist is None:
+            self.decoupage_blacklist = ()
+        self.flatten = flatten
+        
+        
+    
+    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)
+            doc = Ft.Xml.Domlette.ConvertDocument(doc)             
+            con = xml.xpath.Context.Context(doc, 1, 1, None)
+            #open .iri and get the title
+            res = xml.xpath.Evaluate("/iri/head/meta[@name='title']/@content", context=con)
+            self.title = res[0].value
+            
+        #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)
+            
+            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 = xml.xpath.Evaluate("/iri/body/ensembles",context=con)
+        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")
+                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":
+                    if newEnsemble is None:
+                        newensemble = doc.createElement('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)
+                        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)
+                    if ensembleid in ensembleids:
+                        ensembleid = self.id+"_"+str(uuid.uuid1())
+                        cloneNode.setAttribute(u"id", ensembleid)
+                    ensembleids.append(ensembleid)
+                    ensemblesnode.appendChild(cloneNode)
+
+        res = xml.xpath.Evaluate("/iri/body/medias/media[@id='video']/video", context=con)
+        if self.flatten:
+            src_video = res[0].getAttribute('src')
+            self.videourl = os.path.basename(src_video)
+            res[0].setAttributeNS(None,'src', self.videourl)
+        self.duration = res[0].getAttributeNS(None, u'dur')
+            
+        f = open(path, "w")
+        try:
+            xml.dom.ext.Print(doc, stream=f)
+        finally:
+            f.close()
+        
+        
+        destPath = os.path.join(os.path.join(os.path.join(settings.MEDIA_ROOT, "media"), "ldt"), self.id);
+        if not os.path.exists(destPath):
+            os.makedirs(destPath)
+        shutil.move(os.path.join(self.basepath, self.src), os.path.join(destPath, os.path.basename(self.src)))
+        self.src = self.id + u"/" + os.path.basename(self.src)
+
+
+
+    def saveContent(self):
+        #if 'http' in self.src:
+        #    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})
+        if not self.created:
+            content.iriurl = self.src
+            content.title = self.title
+            content.description = self.desc
+            content.save()
+
+        content.iriurl = self.src
+        content.videopath = self.videopath.rstrip("/") + "/"
+
+        content.iri = self.id + u"/" + os.path.basename(self.src)
+        content.title = self.title
+        content.description = self.desc
+        content.duration = int(self.duration)
+        content.save()
+
+        self.content = content
+            
+    def process(self):
+        self.processIri()
+        self.saveContent()
+        
+class BaseFileImport(object):
+
+    def __init__(self, filepath, videopath):
+        self.__filepath = filepath
+        self.__tempdir = ""
+        self.__videopath = videopath
+        self.__author = None
+
+        
+    def filepath(): #@NoSelf
+        doc = """Docstring""" #@UnusedVariable
+       
+        def fget(self):
+            return self.__filepath
+           
+        def fset(self, value):
+            self.__filepath = value
+           
+        def fdel(self):
+            del self.__filepath
+           
+        return locals()
+       
+    filepath = property(**filepath())
+    
+    def videopath(): #@NoSelf
+        doc = """Docstring""" #@UnusedVariable
+       
+        def fget(self):
+            return self.__videopath
+           
+        def fset(self, value):
+            self.__videopath = value
+           
+        def fdel(self):
+            del self.__videopath
+           
+        return locals()
+       
+    videopath = property(**videopath())
+
+    def author(): #@NoSelf
+        doc = """Docstring""" #@UnusedVariable
+       
+        def fget(self):
+            return self.__author
+           
+        def fset(self, value):
+            self.__author = value
+           
+        def fdel(self):
+            del self.__author
+           
+        return locals()
+
+    author = property(**author())
+    
+       
+class FileImport(BaseFileImport):
+
+    def __init__(self, filepath, videopath, flatten):
+        BaseFileImport.__init__(self, filepath, videopath)
+        self.__checkExistingMedia = False
+        self.__flatten = flatten
+        
+    def checkExistingMedia(): #@NoSelf
+        doc = """Docstring""" #@UnusedVariable
+       
+        def fget(self):
+            return self.__checkExistingMedia
+           
+        def fset(self, value):
+            self.__checkExistingMedia = value
+           
+        def fdel(self):
+            del self.__checkExistingMedia
+           
+        return locals()
+
+    checkExistingMedia = property(**checkExistingMedia())    
+
+    def flatten(): #@NoSelf
+        doc = """Docstring""" #@UnusedVariable
+       
+        def fget(self):
+            return self.__flatten
+           
+        def fset(self, value):
+            self.__flatten = value
+           
+        def fdel(self):
+            del self.__flatten
+           
+        return locals()
+    flatten = property(**flatten())
+
+    def processLdt(self, ldtpath=None):
+        
+        # list iri
+        # see if there is some comments
+        # inject comment in iri
+        # 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)
+        
+        con = xml.xpath.Context.Context(doc, 1, 1, None)
+        
+        #get author from file ldt
+        result = xml.xpath.Evaluate("/iri/project", context=con)
+        for pnode in result:
+            author = pnode.getAttributeNS(None,u"user")
+            if author:
+                self.author = unicode(author)
+                break 
+
+        result = xml.xpath.Evaluate("/iri/medias/media", context=con)
+        
+        for i, medianode in  enumerate(result):
+        # get iri file's id from file ldt
+            id = medianode.attributes['id'].value
+            if self.checkExistingMedia:
+                try:
+                    Content.objects.get(iri_id=id)
+                    do_pass = True
+                except ObjectDoesNotExist: #Content.DoesNotExist
+                    do_pass = False
+            else:
+                    do_pass = False
+            if not do_pass:
+                if not (contents.has_key(id)):
+                    # Create instance iriInfo(id, order, titledesc, basepath="", videopath=settings.STREAM_URL)
+                    if ldtpath:
+                        contents[id] = IriInfo(id, i, "", os.path.dirname(ldtpath), flatten=self.flatten)
+                    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
+                elif self.videopath !="" or self.videopath:
+                    contents[id].videopath = self.videopath
+                else:
+                    contents[id].videopath =settings.STREAM_URL
+                    
+                
+        #get annotation of file ldt
+        result = xml.xpath.Evaluate("/iri/annotations/content", context=con)
+        
+        for contentnode in result:
+            id = contentnode.attributes['id'].value
+            # pocketfilms.utils.log.debug("ID : " + str(id))
+            if contents.has_key(id):
+                if self.author:
+                    contentnode.setAttributeNS(None,"author", unicode(self.author))
+                contents[id].annotations = contentnode
+        
+        #go throught values
+        for iriinfo in contents.values():
+            
+            iriinfo.process()
+            
+            # if yes update
+            # if no create
+            # move iri file to the proper place
+            #return list of iriInfo
+        
+    def processFile(self):
+        if self.filepath.name.endswith(".ldt"):
+            self.processLdt()
+        elif self.filepath.name.endswith(".zip"):
+            self.processZip()
+        else:
+            raise FileImportError("Bad file type")
+
+
+    def processZip(self):
+    # """ extraire .zip, pass to method processLdt"""
+        # create temp directory
+        self.__tempdir = tempfile.mkdtemp()
+        openfiles = []
+        flvfiles = []
+        processedids = []
+        
+        try:
+            zipfile = zipfileext.ZipFileExt(self.filepath)
+            zipfile.unzip_into_dir(self.__tempdir)
+            #load ldt
+            foldersToProcess = [self.__tempdir]
+            while len(foldersToProcess):
+                # pocketfilms.utils.log.debug("folder stack length : "+ str(len(foldersToProcess)))
+                currentFolder = foldersToProcess.pop()
+                for entry in os.listdir(currentFolder):
+                    if entry in settings.ZIP_BLACKLIST:
+                        continue
+                    entryPath = os.path.join(currentFolder, entry)
+                    if(os.path.isdir(entryPath)):
+                        # pocketfilms.utils.log.debug("Push folder : " + entryPath)
+                        foldersToProcess.append(entryPath)
+                    elif fnmatch.fnmatch(entry, "*.ldt"):
+                        # pocketfilms.utils.log.debug("Process file : " + entryPath)
+                        ldtid = self.processLdt(entryPath)
+                        processedids.append(ldtid)
+                    elif fnmatch.fnmatch(entry, "*.flv"):
+                        flvfiles.append(entryPath)
+             
+            if settings.CONTENT_ROOT and os.path.exists(settings.CONTENT_ROOT): 
+                for entry in flvfiles:
+                    shutil.copy(entry, settings.CONTENT_ROOT)
+                    
+        finally:
+            for f in openfiles:
+                f.close()
+            shutil.rmtree(self.__tempdir)
+        # delete directory
+        return processedids
+        
+    # def processFileLdt(self):
+        # processedids = []
+        # ldtid = self.processLdt(self.filepath)
+        # processedids.append(ldtid)
+        # return processedids
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/forms.py	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,29 @@
+from django import forms
+from models import Project, Content
+import uuid
+
+class LdtImportForm(forms.Form):
+    importFile = forms.FileField()
+    videoPath = forms.CharField(required=False)
+    flatten = forms.BooleanField(required=False, initial=True)   
+    
+class LdtAddForm(forms.ModelForm):
+    title = forms.CharField()
+    # contents = forms.ModelMultipleChoiceField(Content.objects.all())
+    # owner = forms.ModelChoiceField(Author.objects.all())
+    class Meta:
+        model = Project
+        exclude = ("ldt_id", "ldt", "created_by", "changed_by", "creation_date", "modification_date", "state", "owner")   
+
+class ReindexForm(forms.Form):
+    contents = forms.ModelMultipleChoiceField(Content.objects.all())
+
+class SearchForm(forms.Form):
+    search = forms.CharField()
+    field = forms.ChoiceField([(u"all", u"all"), (u"title", u"title"), (u"abstract", u"resume"), (u"tags", u"tags")])
+
+class AddProjectForm (forms.Form):
+    title = forms.CharField()
+
+class CopyProjectForm (forms.Form):
+    title = forms.CharField()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/models.py	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,165 @@
+from django.db import models
+from django.conf import settings
+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
+import os
+import os.path
+import uuid
+import xml
+
+class Author(models.Model):
+
+    handle = models.CharField(max_length=512, unique=True, blank=True, null=True)
+    email = models.EmailField(unique=False, blank=True, null=True)
+    firstname = models.CharField(max_length=512, blank=True, null=True)
+    lastname = models.CharField(max_length=512, blank=True, null=True)
+    
+    def __unicode__(self):
+        return unicode(self.id) + " - " + self.handle + ", " + self.email + ", " + self.firstname + " " + self.lastname
+
+
+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)
+
+    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'))
+            self.save()
+        return self.duration
+    
+    def delete(self):
+        super(Content, self).delete()
+        writer = lucene.IndexWriter(STORE, ANALYZER, True, lucene.IndexWriter.MaxFieldLength.UNLIMITED)
+        writer.deleteDocuments(lucene.Term("iri_id", self.iri_id))
+        writer.commit()
+        
+    def save(self):
+        # create iri file if needed
+        try:
+            iri_file_path = self.iri_file_path()
+            if not os.path.exists(iri_file_path):
+                dir = os.path.dirname(iri_file_path)
+                if not os.path.exists(dir):
+                    os.makedirs(dir)
+                file = open(iri_file_path,"w")
+                create_empty_iri(file, self, "IRI")
+        except Exception, e:
+            if os.path.exists(iri_file_path):
+                os.remove(iri_file_path)
+                raise e
+        # update it 
+        super(Content, self).save()
+    
+    def __unicode__(self):
+        return str(self.id) + ": " + self.iri_id
+        
+    def iri_url(self, web_url=settings.WEB_URL):
+        if 'http' in self.iriurl or 'https' in self.iriurl:
+            return self.iriurl
+        else:
+            return unicode(web_url) + unicode(settings.MEDIA_URL)+u"media/ldt/"+unicode(self.iriurl)
+    
+    def iri_file_path(self):
+        return os.path.join(os.path.join(os.path.join(os.path.join(settings.MEDIA_ROOT, "media"), "ldt"), self.iri_id), os.path.basename(self.iriurl))
+
+    def iri_url_template(self):
+        return "${web_url}${media_url}media/ldt/" + unicode(self.iri_id) + "/" + os.path.basename(self.iriurl)
+        
+        
+class Project(Document):  
+    STATE_CHOICES=(
+    (1, 'edition'),
+    (2, 'published'),
+    (3, 'moderated'),
+    (4, 'rejected'),
+    (5, 'deleted')
+    )
+    ldt_id = models.CharField(max_length=1024, unique=True)
+    ldt = models.TextField(null=True)
+    title = models.CharField(max_length=1024)
+    contents = models.ManyToManyField(Content)
+    creation_date = models.DateTimeField(auto_now_add=True)
+    modification_date = models.DateTimeField(auto_now=True)
+    created_by = models.CharField(_("created by"), max_length=70)
+    changed_by = models.CharField(_("changed by"), max_length=70)
+    state = models.IntegerField(choices=STATE_CHOICES, default=1)
+    
+    def __unicode__(self):
+        return unicode(self.id) + u": " + unicode(self.ldt_id)
+    
+    def get_description(self, doc=None):
+        
+        if doc is None:
+            doc = xml.dom.minidom.parseString(self.ldt)
+            doc = Ft.Xml.Domlette.ConvertDocument(doc)        
+        
+        con = xml.xpath.Context.Context(doc, 1, 1, None)
+        res = xml.xpath.Evaluate("/iri/project", context=con)
+        if len(res) > 0:
+            return res[0].getAttributeNS(None, u'abstract')
+        else:
+            return None
+        
+
+    @staticmethod
+    def create_project(user, title, contents):
+        owner = Owner.objects.get(user=user)
+        project = Project(title=title, owner=owner)
+        project.ldt_id = str(uuid.uuid1())
+        project.created_by=user.username
+        project.changed_by=user.username
+        project.state = 1
+        project.save()
+        for content in contents:
+            project.contents.add(content)
+        project.save()
+        return create_ldt(project, user)
+
+    def copy_project(self, user, title):
+        owner = Owner.objects.get(user=user)
+        project = Project(title=title, owner=owner)
+        project = copy_ldt(self, project, user)
+        project.save()
+        for content in self.contents.all():
+            project.contents.add(content)
+        project.save()
+        return project
+
+class Segment(models.Model):
+    
+    project_obj = models.ForeignKey(Project, null=True)
+    content = models.ForeignKey(Content)
+    project_id = models.CharField(max_length=1024, unique=False, blank=True, null=True)
+    iri_id = models.CharField(max_length=1024, unique=False)
+    ensemble_id = models.CharField(max_length=1024, unique=False)
+    cutting_id = models.CharField(max_length=1024, unique=False)    
+    element_id = models.CharField(max_length=1024, unique=False)
+    tags = models.CharField(max_length=2048, unique=False, null=True, blank=True)  
+    title = models.CharField(max_length=2048, unique=False, null=True, blank=True)
+    duration = models.IntegerField(null=True)
+    start_ts = models.IntegerField(null=True)
+    author = models.CharField(max_length=1024, unique=False, null=True, blank=True)
+    date = models.CharField(max_length=128, unique=False, null=True, blank=True)
+    abstract = models.TextField(null=True, blank=True)
+    
+    def __unicode__(self):
+        return "/".join((unicode(self.project_id), unicode(self.iri_id), unicode(self.ensemble_id), unicode(self.cutting_id), unicode(self.element_id)))
+    
+    class Meta:
+        unique_together = (('project_id', 'iri_id', 'ensemble_id', 'cutting_id', 'element_id'),)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/projectindexer.py	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,110 @@
+import tempfile
+import os
+import os.path
+import shutil
+import ldt.utils.xml
+from ldt import settings
+import xml
+import xml.dom
+import xml.dom.minidom
+import xml.dom.ext
+import xml.xpath
+import lucene
+from ldt.ldt_utils import STORE
+from ldt.ldt_utils import ANALYZER
+
+def Property(func):
+    return property(**func()) 
+
+class ProjectIndexer(object):
+    def __init__(self, projectList, writer, decoupage_blackList = settings.DECOUPAGE_BLACKLIST):
+        self.__projectList = projectList
+        self.__decoupage_blacklist = decoupage_blackList
+        self.__writer = writer
+            
+    @Property
+    def decoupage_blacklist(): #@NoSelf
+        doc = """get blacklist""" #@UnusedVariable
+       
+        def fget(self):
+            if self.__decoupage_blacklist is None:
+                self.__decoupage_blacklist = ()
+            return self.__decoupage_blacklist
+           
+        def fset(self, value):
+            self.__decoupage_blacklist = value
+           
+        def fdel(self):
+            del self.__decoupage_blacklist
+           
+        return locals()
+               
+    def index_all(self):
+        for project in self.__projectList:
+            self.index_project(project)
+
+    def index_project(self, project):
+        # ldt.utils.log.debug("Indexing project : "+str(project.ldt_id))
+        ldt=project.ldt
+        doc = xml.dom.minidom.parseString(ldt.encode( "utf-8" ))
+        
+        self.__writer.deleteDocuments(lucene.Term("ldt_id", project.ldt_id))
+            
+        con = xml.xpath.Context.Context(doc, 1, 1, None)
+        res = xml.xpath.Evaluate("/iri/annotations/content", context=con)
+
+        for content in res:
+            contentId = content.getAttribute("id")
+            
+            res =xml.xpath.Evaluate("ensemble", content)
+            for ensemble in res:
+                ensembleId = ensemble.getAttribute("id")
+                
+                for decoupageNode in ensemble.childNodes:
+                    # ldt.utils.log.debug("Indexing project decoupage : "+ repr(decoupageNode.nodeType) + " in " + repr(self.decoupage_blacklist))
+                    if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage"  or decoupageNode.getAttribute("id") in self.decoupage_blacklist:
+                        continue
+                
+                    decoupId = decoupageNode.getAttribute("id")
+                    res = xml.xpath.Evaluate("elements/element", decoupageNode)
+                    for elementNode in res:
+                        doc = lucene.Document()
+                        elementId = elementNode.getAttribute("id")
+                        tags = elementNode.getAttribute("tags")
+                        
+                        if tags is not None:                            
+                            tags.replace(",", ";")
+                        
+                        if tags is None or len(tags) == 0:
+                            tags = ""
+                            restagnode = xml.xpath.Evaluate("tag/text()", elementNode)
+                            for tagnode in restagnode:
+                                tags = tags + " ; " + tagnode.data
+                                
+                        if tags is None or len(tags) == 0:
+                            tags = ""
+                            restagnode = xml.xpath.Evaluate("tags/tag/text()", elementNode)
+                            for tagnode in restagnode:
+                                tags = tags + " ; " + tagnode.data                            
+
+                        title = ""
+                        for txtRes in xml.xpath.Evaluate("title/text()", elementNode): 
+                            title = title + txtRes.data 
+                
+                        abstract = ""
+                        for txtRes in xml.xpath.Evaluate("abstract/text()", elementNode): 
+                            abstract = abstract + txtRes.data 
+                            
+                        doc.add(lucene.Field("ldt_id", project.ldt_id, lucene.Field.Store.YES, lucene.Field.Index.UN_TOKENIZED))              
+                        doc.add(lucene.Field("iri_id", contentId, lucene.Field.Store.YES, lucene.Field.Index.UN_TOKENIZED))
+                        doc.add(lucene.Field("ensemble_id", ensembleId, lucene.Field.Store.YES, lucene.Field.Index.NO))
+                        doc.add(lucene.Field("decoupage_id", decoupId, lucene.Field.Store.YES, lucene.Field.Index.NO))
+                        doc.add(lucene.Field("element_id", elementId, lucene.Field.Store.YES, lucene.Field.Index.NO))
+                        doc.add(lucene.Field("tags", tags, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
+                        doc.add(lucene.Field("title", title, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
+                        doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
+                        doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
+            
+                        self.__writer.addDocument(doc)
+    
+        self.__writer.flush()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/projectserializer.py	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,302 @@
+import xml.dom
+import Ft.Xml.Domlette
+import xml.xpath
+from datetime import datetime
+from ldt.ldt_utils.models import Content, Project
+
+DATE_FORMATS = ["%d/%m/%Y","%Y-%m-%d"]
+
+"""
+Serialize a project object to a cinelab compatible array
+"""
+class ProjectSerializer:
+    
+    def __init__(self, project):
+        self.project = project
+        self.ldt_doc = None
+        self.medias = []
+        self.annotations = []
+        self.tags = {}
+        self.annotation_types = []
+        self.views = []
+        self.lists = []
+        
+    
+    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_created = datetime.utcnow().isoformat()
+        ensemble_modified = ensemble_created 
+        
+        list_items = []
+        new_list = {
+            "id" : ensemble_id,
+            "items" : list_items,
+            "metas" : {
+                "dc:creator":ensemble_author,
+                "dc:created": ensemble_created,
+                "dc:contributor":"undefined",
+                "dc:modified": ensemble_modified,
+                "dc:title":ensemble_title,
+                "dc:description": ensemble_description,
+                "id-ref":content.iri_id,
+                "editable":"false"
+            }
+        }
+        
+        self.lists.append(new_list)
+        
+        for decoupage_node in ensemble_node.childNodes:
+            if decoupage_node.nodeType != xml.dom.Node.ELEMENT_NODE or decoupage_node.tagName != "decoupage" :
+                continue
+            
+            decoupage_id = decoupage_node.getAttributeNS(None, u"id")
+            decoupage_creator = decoupage_node.getAttributeNS(None,u"author")
+            if not decoupage_creator:
+                decoupage_creator = "IRI"
+            decoupage_contributor = decoupage_creator
+            date_str = decoupage_node.getAttributeNS(None,u"date")
+            decoupage_created = None
+            if date_str :
+                for date_format in DATE_FORMATS:
+                    try:
+                        decoupage_created = datetime.strptime(date_str,date_format).isoformat()
+                        break
+                    except Exception:
+                        decoupage_created = None
+            if decoupage_created is None:
+                decoupage_created = datetime.utcnow().isoformat()
+            decoupage_modified = decoupage_created
+            
+            decoupage_title = ""
+            for txtRes in xml.xpath.Evaluate("title/text()", decoupage_node): 
+                    decoupage_title += txtRes.data
+
+            decoupage_description = ""
+            for txtRes in xml.xpath.Evaluate("abstract/text()", decoupage_node): 
+                    decoupage_description += txtRes.data
+            
+
+            
+            list_items.append({"id-ref":decoupage_id})
+            
+            new_annotation_types = {
+                "id":decoupage_id,
+                "dc:creator":decoupage_creator,
+                "dc:created":decoupage_created,
+                "dc:contributor":decoupage_contributor,
+                "dc:modified":decoupage_modified,
+                "dc:title":decoupage_title,
+                "dc:description":decoupage_description
+            }
+            
+            self.annotation_types.append(new_annotation_types)            
+                        
+            res = xml.xpath.Evaluate("elements/element", decoupage_node)
+            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_media = content.iri_id
+                element_color = element_node.getAttributeNS(None,u"color")
+                
+                element_title = ""
+                for txtRes in xml.xpath.Evaluate("title/text()", element_node): 
+                    element_title += txtRes.data 
+        
+                element_description = ""
+                for txtRes in xml.xpath.Evaluate("abstract/text()", element_node): 
+                    element_description += txtRes.data 
+                
+                element_audio_src = ""
+                element_audio_href = ""
+                res = xml.xpath.Evaluate("audio", element_node)
+                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_tags = []
+                
+                tags = element_node.getAttributeNS(None,u"tags")
+                
+                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)
+                    for tagnode in restagnode:
+                        tags_list.append(tagnode.data)
+                        
+                if tags_list is None or len(tags_list) == 0:
+                    tags_list = []
+                    restagnode = xml.xpath.Evaluate("tags/tag/text()", element_node)
+                    for tagnode in restagnode:
+                        tags_list.append(tagnode.data)
+                
+                tag_date = datetime.utcnow().isoformat()
+                for tag_id in tags_list:
+                    if tag_id not in self.tags:
+                        new_tag = {
+                            "id":tag_id,
+                            "metas" : {
+                                "dc:creator":"IRI",
+                                "dc:created": tag_date,
+                                "dc:contributor":"IRI",
+                                "dc:modified": tag_date,
+                                "dc:title":tag_id
+                            }
+                        }
+                        self.tags[tag_id] = new_tag
+                    element_tags.append({"id-ref":tag_id})
+
+                new_annotation = {
+                    "begin": element_begin,
+                    "end": int(element_begin) + int(element_duration),
+                    "id": element_id,
+                    "media": element_media,
+                    "content": {
+                        "mimetype": "application/x-ldt-structured",
+                        "title": element_title,
+                        "description": element_description,
+                        "color": element_color,
+                        "audio": {
+                            "src" : element_audio_src,
+                            "mimetype": "audio/mp3",
+                            "href": element_audio_href
+                        },
+                    },
+                    "metas": {
+                        "id-ref": decoupage_id,
+                        "dc:creator": decoupage_creator,
+                        "dc:contributor": decoupage_contributor,
+                        "dc:created": decoupage_created,
+                        "dc:modified": decoupage_modified
+                    }
+                }
+                
+                self.annotations.append(new_annotation)
+        
+
+    
+    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)
+        
+        res = xml.xpath.Evaluate("/iri/medias/media", context=con)
+        for mediaNode in res:
+            iri_id = mediaNode.getAttributeNS(None,u"id")
+            content = Content.objects.get(iri_id=iri_id)
+            self.__parse_content(content)
+            
+        res = xml.xpath.Evaluate("/iri/annotations/content",context=con)               
+        
+        for content_node in res:
+            content_id = content_node.getAttributeNS(None, 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" :
+                    continue
+                self.__parse_ensemble(ensemble_node, content)
+            
+        #res = xml.xpath.Evaluate("/iri/displays/display",context=con)
+        
+        #for display_node in res:
+            
+    
+    
+    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)
+        
+        authors = content.authors.all()
+        
+        if len(authors) > 0 :
+            author = authors[0].handle
+        else :
+            author = "IRI"
+        
+        if len(authors) > 1 :
+            contributor = authors[1].handle
+        else :
+            contributor = author
+        
+        content_author = ""
+        
+        res = xml.xpath.Evaluate("/iri/head/meta[@name='author']/@content", context=con)
+        if len(res) > 0:
+            content_author = res[0].value
+        
+        
+        content_date = ""
+        
+        res = xml.xpath.Evaluate("/iri/head/meta[@name='date']/@content", context=con)
+        if len(res) > 0:
+            content_date = res[0].value
+
+        
+        new_media = {
+             "http://advene.liris.cnrs.fr/ns/frame_of_reference/ms" : "o=0",
+             "id" : content.iri_id,
+             "url" : content.videopath.rstrip('/') + "/" + content.src,
+             "dc:creator" : author,
+             "dc:created" : content.creation_date.isoformat(),
+             "dc:contributor" : contributor,
+             "dc:modified" : content.update_date.isoformat(),
+             "dc:creator.contents" : content_author,
+             "dc:created.contents" : content_date,
+             "dc:title" : content.title,
+             "dc:description" : content.description,
+             "dc:duration" : content.get_duration(),
+        }
+        
+        self.medias.append(new_media)
+        
+        
+        res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble",context=con)
+        
+        for ensemble_node in res:
+            self.__parse_ensemble(ensemble_node, content)
+
+    
+    def serialize_to_cinelab(self):
+    
+        res = {}
+        
+        self.__parse_ldt()
+        
+        project_main_media = ""
+        if len(self.medias) > 0:
+            project_main_media = self.medias[0]["id"]
+        
+        res['metas'] = {
+             'id': self.project.ldt_id,
+             'dc:created':self.project.creation_date.isoformat(),
+             'dc:modified':self.project.modification_date.isoformat(),
+             'dc:contributor':self.project.changed_by,
+             'dc:creator':self.project.created_by,
+             'dc:title':self.project.title,
+             'dc:description':self.project.get_description(self.ldt_doc), # get from doc, parse ldt
+             'main_media': {"id-ref":project_main_media}
+            }
+        
+        res['medias'] =  self.medias
+        res['annotation-types'] = self.annotation_types
+        res['annotations'] = self.annotations
+        res['lists'] = self.lists
+        res['tags'] = self.tags.values()
+        res['views'] = self.views # ignored for the moment
+        
+        return res
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/templates/admin/ldt_utils/app_action.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,6 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block breadcrumbs %}
+<div class="breadcrumbs"><a href="{% url admin:index %}"> {% trans "Home" %}</a> &rsaquo; <a href="{% url admin:app_list 'ldt' %}">ldt</a> &rsaquo; {{ current_action }}</div>
+{% endblock %}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/templates/admin/ldt_utils/app_index.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,32 @@
+{% extends "admin/app_index.html" %}
+{% block extrastyle %}
+    {{ block.super }}
+    <link rel="stylesheet" type="text/css" href="{% load ldtmedia %}{% ldt_media_prefix %}css/dashboard.css" />
+{% endblock %}
+{% load i18n %}
+{% block content %}
+{{ block.super }}
+<div id="content-main-app-ldt-utils">
+	<div class="module">
+	<table summary="Import">
+		<caption>Import</caption>
+		<tr>
+			<th><a href="{{WEB_URL}}{% url admin:ldt_content_import_file %}">Import
+			an ldt</a></th>
+			<td>&nbsp;</td>
+			<!--tr>
+	                    <th>            
+	                        <a href="content/export/form">Generate ldt</a>
+	                    </th>
+	                    <td>&nbsp;</td>
+	                </tr-->
+			<tr>
+				<th><a href="{{WEB_URL}}{% url admin:ldt_content_reindex %}">Reindex</a>
+				</th>
+				<td>&nbsp;</td>
+			</tr>
+	</table>
+	</div>
+</div>
+
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/templates/admin/ldt_utils/content/reindex_form.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,23 @@
+{% extends "admin/ldt_utils/app_action.html" %}
+{% load i18n %}
+{# reindex contents #}
+{% block content %}
+{% if message %}
+<div>
+<p>{{ message }}</p>
+</div>
+{% endif %} {% if form. %}
+<div></div>
+{% endif %}
+<div>
+<form method="post"
+	action="{{WEB_URL}}{% url admin:ldt_content_reindex %}">{% csrf_token %}
+<table>
+	{{ form.as_table }}
+</table>
+<input type="submit" /></form>
+</div>
+
+<a href="{{WEB_URL}}{% url admin:app_list 'ldt_utils' %}">Back to administration page</a>
+
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/templates/admin/ldt_utils/content/upload_form.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,27 @@
+{% extends "admin/ldt_utils/app_action.html" %}
+{# import an ldt #}
+{% block content %}
+<p>Vous pouvez importer un fichier ldt ou un zip qui compresse un
+fichier .ldt et plusieurs fichiers .iri.</p>
+<p>Bien verifiez vous que le chemin de source est absolute pour un
+fichier ldt lors qu'il est tout seul, alors qu'il est relatif s'il est
+dans le zip</p>
+<p>Vous pouvez indiquer le chemin de video si vous avez besoin</p>
+{% if message %}
+<div>
+<p>{{ message }}</p>
+</div>
+{% endif %}
+
+{% if form %}
+
+<form method="post" enctype="multipart/form-data" action="">{% csrf_token %}
+<table>
+	{{ form.as_table }}
+</table>
+<input type="submit" /></form>
+{% endif %}
+
+<a href="{% url admin:app_list 'ldt_utils' %}">Back to administration page</a>
+
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/copy_ldt.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,19 @@
+{% load i18n %} {# form of copy of project ldt #}
+<!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>
+<link rel="stylesheet" href="{{BASE_URL}}static/ldt/css/ldt.css" />
+</head>
+<body>
+<div id="add_contribution">
+<div class="title">{% trans "Copy your project" %}</div>
+
+<form action="" method="POST">{% csrf_token %}
+	<label for="title">{%trans "Title" %}:</label>
+	<input class="inputbox required" type="text" name="title" size="80"  value="" id="title" />
+	<input class="button" id="ldt_submit" type="submit" value="{% trans 'Copy' %}" /></form>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,27 @@
+{% load i18n %} {# form of creation of project ldt #}
+<!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>
+	<link rel="stylesheet" href="{{BASE_URL}}static/ldt/css/ldt.css" />
+</head>
+<body>
+<div id="add_contribution">
+<div class="title">{% 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" />
+<div class="title">{% trans "List of contents" %}</div>
+<ul class='contentlist'>
+	{% for content in contents %}
+	<li><input type="checkbox" name="contents" value="{{ content.id}}"
+		checked="true" />{{content.iri_id}}</li>
+	{% endfor %}
+</ul>
+<input class="button" id="ldt_submit" type="submit" value="{% trans 'Create' %}" />
+</form>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/init_ldt.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,51 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta http-equiv="Cache-Control" content="no-cache, must-revalidate" />
+<meta http-equiv="Pragma" content="no-cache" />
+<meta http-equiv="Cache" content="no store" />
+<meta http-equiv="Expires" content="-1" />
+<title>Ligne de Temps - IRI</title>
+<script type="text/javascript" src="{{MEDIA_URL}}js/swfobject.js"></script>
+<script type="text/javascript">
+	    
+	</script>
+</head>
+
+<body id="init_ldt_view">
+
+<div id="ldtInit" style="width: 1001px; height: 631px;">&nbsp;</div>
+<script language="JavaScript" type="text/javascript">
+
+        var params = {
+            quality:"high",
+            allowFullScreen:"true",
+            wmode:"transparent",
+            allowScriptAccess:"always"
+        };
+    
+        var flashvars = {
+            colorUrl:'{{colorurl}}',
+            i18nUrl: '{{i18nurl}}',
+            language: '{{language}}',
+            {% if url %}
+            urlBase:'{{baseurl}}',
+            initUrl:'{{url}}',
+            {% endif %}
+            {% ifequal readonly 'false' %}
+            readOnly: '{{readonly}}',
+            postUrl:'{{posturl}}',
+            postVars: encodeURIComponent('id={{id}}&csrfmiddlewaretoken={{csrf_token}}'),
+            {% else %}
+            readOnly:'true',
+            {% endifequal %}
+            startTime:'100'     
+        };
+
+        var attributes = {  id: "ldtInitSwf",  name: "ldtInitSwf"};
+
+        swfobject.embedSWF("{{ MEDIA_URL }}swf/ldt/LignesDeTempsFlex.swf", "ldtInit", "1001", "631", "9.0.0", "{{ MEDIA_URL }}swf/expressInstall.swf", flashvars, params, attributes);
+
+    </script>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/ldt_list.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,86 @@
+{% extends "ldt/user/user_base.html" %}
+{# list of projects ldt #}
+{%load i18n %}
+{% block js_import %}{{ block.super }}
+<script type="text/javascript">           
+        $(document).ready(function(){
+        	$('.ldt_link').nyroModal({
+        		height:662, 
+        		width:1022, 
+        		type:'iframe',
+        		forceType:'iframe',
+        		padding:5,
+        		bgColor: 'rgb(239, 239, 239)',
+                titleFromIframe: false,
+                beforeHideContent: function(elts, settings, callback){
+                    try {                       
+                        var res = $('#ldtInitSwf',$('#nyroModalIframe').contents());
+                        if(res.length > 0)
+                        {
+                            var swfobj = res.get(0);
+                            if(swfobj && swfobj.forceSave != undefined)          
+                                swfobj.forceSave();
+                        }
+                    }
+                    catch(err)
+                    {
+                        // do nothing
+                    }                   
+                    callback();
+                }        		
+            	});
+            $('.create_ldt_link').nyroModal({
+        		height:662, 
+        		width:1022, 
+        		type:'ajax', 
+        		padding:5,
+        		bgColor: 'rgb(239, 239, 239)',
+            	});       
+        });        	        
+</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 "Ldt Project" %}{%endblock %}
+
+{% block iricontent %}
+<div id='ldtlist'><a
+	href="{% url ldt.ldt_utils.views.create_ldt_view %}" class="create_ldt_link">{% trans 'Create new project'%}</a>
+<table>
+	<caption>{% trans "Project" %}</caption>
+	<thead>
+		<tr>
+			<th width="170">{% trans "title" %}</th>
+			<th width="20">{% trans " published" %}</th>
+		</tr>
+	</thead>
+	<tbody>
+		{% for ldt in ldtProjects %}
+		<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>
+			{% 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>
+			{% endifequal %}
+		</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/loading.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,26 @@
+<!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>
+<style type="text/css">
+.center {
+	position: absolute;
+	top: 50%;
+	left: 50%;
+}
+
+.center div {
+	position: relative;
+	top: -7px;
+	left: -104px;
+}
+</style>
+</head>
+<body>
+<div class="center">
+<div><img alt="loading"
+	src="{{MEDIA_URL}}img/loadingAnimation.gif" /></div>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/save_done.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,5 @@
+<p>done</p>
+<p>{{ldt}}
+<p>
+<p>{{id}}</p>
+<p>title:{{title}}</p>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/search_form.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,13 @@
+{% extends "base.html" %} {% block content %}
+
+<form method="post"
+	action="{{WEB_URL}}{% url ldt.ldt_utils.views.searchIndex %}"
+	accept-charset="utf-8">
+
+<table>
+	{{ form.as_table }}
+</table>
+<input type="submit" /></form>
+
+
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/tests.py	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,23 @@
+"""
+This file demonstrates two different styles of tests (one doctest and one
+unittest). These will both pass when you run "manage.py test".
+
+Replace these with more appropriate tests for your application.
+"""
+
+from django.test import TestCase
+
+class SimpleTest(TestCase):
+    def test_basic_addition(self):
+        """
+        Tests that 1 + 1 always equals 2.
+        """
+        self.failUnlessEqual(1 + 1, 2)
+
+__test__ = {"doctest": """
+Another way to test that 1 + 1 is equal to 2.
+
+>>> 1 + 1 == 2
+True
+"""}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/urls.py	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,37 @@
+from django.conf.urls.defaults import *
+from ldt.management import test_ldt
+
+# Uncomment the next two lines to enable the admin:
+# from django.contrib import admin
+# admin.autodiscover()
+
+urlpatterns = patterns('ldt.ldt_utils',
+    url(r'^searchInit/(?P<field>.*)/(?P<query>.*)$', 'views.searchInit'),
+    url(r'^searchForm/$', 'views.searchForm'),
+    url(r'^search/$', 'views.searchIndex'),
+    url(r'^search/(?P<field>.*)/(?P<query>.*)$', 'views.searchIndexGet'),
+    url(r'^searchLdt/(?P<field>.*)/(?P<query>.*)$', 'views.searchLdt'),
+    url(r'^searchSeg/(?P<field>.*)/(?P<query>.*)$', 'views.searchSegments'),
+    url(r'^index/(?P<url>.*)$', 'views.index'),
+    url(r'^init/(?P<method>.*)/(?P<url>.*)$', 'views.init', name='ldt_init'),
+    url(r'^ldt/(?P<url>.*)$', 'views.ldt'),
+    url(r'^search/loading/$', 'views.loading'),
+    url(r'^create/(?P<iri_id>.*)$', 'views.create_project'),
+    url(r'^copy/(?P<ldt_id>.*)$', 'views.copy_project'),
+    url(r'^cljson/id/(?P<id>.*)$', 'views.project_json_id'),
+    url(r'^cljson/externalid/(?P<id>.*)$', 'views.project_json_externalid'),
+)
+
+if test_ldt():
+    urlpatterns += patterns('ldt.ldt_utils',
+        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'),
+        url(r'^space/ldt/project/(?P<id>.*)$', 'views.ldtProject'),
+        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'),
+
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/utils.py	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,314 @@
+import lucene
+from ldt.ldt_utils import STORE
+from ldt.ldt_utils import ANALYZER
+from Ft.Xml import MarkupWriter
+import uuid
+import django.core.urlresolvers
+from django.conf import settings
+import urllib
+import xml.dom
+import xml.dom.minidom
+import xml.dom.ext
+import xml.xpath
+import os
+import os.path
+import datetime
+
+class LdtSearch(object):
+
+    def query(self, field, query):
+        indexSearcher = lucene.IndexSearcher(STORE)
+        queryParser = lucene.QueryParser(lucene.Version.LUCENE_30, field, lucene.FrenchAnalyzer(lucene.Version.LUCENE_30))
+        queryParser.setDefaultOperator(lucene.QueryParser.Operator.AND)
+        queryObj = queryParser.parse(query)
+        hits = indexSearcher.search(queryObj, settings.LDT_MAX_SEARCH_NUMBER)
+	
+        res = []
+        for hit in hits.scoreDocs:
+            doc = indexSearcher.doc(hit.doc)
+            res.append({"iri_id":doc.get("iri_id"),"ensemble_id":doc.get("ensemble_id"),"decoupage_id":doc.get("decoupage_id"), "element_id":doc.get("element_id")})
+        indexSearcher.close()
+        return res
+
+    def queryAll(self, query):		
+        return self.query("all", query)
+
+class LdtUtils(object):
+    
+    def generateLdt(self, contentList, file, title = u"", author=u"IRI Web", web_url=u"", media_url="", startSegment = None, contributions=None):
+
+        writer = MarkupWriter(file, indent = u"yes")
+        writer.startDocument()
+        writer.startElement(u"iri")
+        writer.simpleElement(u"project", attributes={u"id":unicode(str(uuid.uuid1())), u"title":unicode(title) , u"user":author, u"abstract":u""})
+        writer.startElement(u"medias")
+        for content in contentList:
+            videopath = unicode(settings.STREAM_URL)
+            if content.videopath :
+                videopath = unicode(content.videopath)
+            writer.simpleElement(u"media", attributes={u"id":content.iri_id,u"src":content.iri_url(web_url),u"video":videopath,u"pict":u"",u"extra":u""})
+        writer.endElement(u"medias")
+
+        if contributions is None:
+            contributions = []
+        annotations_nodes = {}
+        for contrib in contributions:
+            doc = xml.dom.minidom.parseString(contrib.ldtproject.ldt.encode("utf-8"))
+            con = xml.xpath.Context.Context(doc, 1, 1, None)
+            res = xml.xpath.Evaluate("/iri/annotations/content", context=con)
+            for content in res:
+                contentid = content.getAttribute("id")
+                if annotations_nodes.has_key(contentid):
+                    contentnode = annotations_nodes[contentid]
+                else:
+                    contentnode = {"id":contentid, "ensembles":[]}
+                    annotations_nodes[contentid]=contentnode
+                for ens in content.childNodes:
+                    if ens.nodeType == xml.dom.Node.ELEMENT_NODE and ens.tagName.endswith("ensemble"):
+                        contentnode["ensembles"].append(ens.toprettyxml())
+
+        if len(annotations_nodes) > 0:
+            writer.startElement(u"annotations")
+            for content in contentList:
+                if content.content_base.iri_id in annotations_nodes:
+                    contentnode = annotations_nodes[content.content_base.iri_id]
+                    if contentnode is not None:
+                        if len(contentnode["ensembles"])>0:
+                            writer.startElement(u"content", attributes={"id":contentnode["id"]})
+                            writer.text(u"")
+                            for ens in contentnode["ensembles"]:
+                                writer.xmlFragment(ens.encode("utf-8"))
+                            writer.endElement(u"content")
+                        else:
+                            writer.simpleElement(u"content", attributes={"id":contentnode["id"]})
+            writer.endElement(u"annotations")
+        else:
+            writer.simpleElement(u"annotations")
+
+
+        writer.startElement(u"displays")
+        if len(contentList) > 0:
+            writer.startElement(u"display", attributes={u"id":u"0",u"title":u"generated",u"idsel":contentList[0].iri_id,u"tc":u"0"})
+            for content in contentList:
+                writer.startElement(u"content", attributes={u"id":content.iri_id})
+                filepath = urllib.urlopen(content.iri_url())
+                doc = xml.dom.minidom.parse(filepath)
+                con = xml.xpath.Context.Context(doc, 1, 1, None)
+                res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble/decoupage", context=con)
+                for decoupagenode in res:
+                    decoupage_id = decoupagenode.getAttribute(u"id")
+                    ensemble_id = decoupagenode.parentNode.getAttribute(u"id")
+                    writer.simpleElement(u"decoupage", attributes={u"id":decoupage_id,u"idens":ensemble_id})
+                writer.endElement(u"content")
+            if startSegment is not None:
+                writer.startElement(u"activeSegment")
+                writer.simpleElement(u"id",attributes={u"idctt" : startSegment["idcontent"],u"idens" : startSegment["idgroup"], u"idcut" : startSegment["idcutting"], u"idseg" : startSegment["idsegment"]})
+                writer.endElement(u"activeSegment")
+
+            writer.endElement(u"display")
+        writer.endElement(u"displays")
+        writer.simpleElement(u"edits")
+        writer.endElement(u"iri")
+
+    def generateInit(self, url, method, search=None):
+        
+        import xml.dom
+        import xml.dom.ext
+    
+        impl = xml.dom.getDOMImplementation()
+        doc = impl.createDocument(xml.dom.EMPTY_NAMESPACE, 'iri', None)
+    
+        elementFiles = doc.createElement('files')
+        doc.documentElement.appendChild(elementFiles)
+    
+        elementInit = doc.createElement('init')
+        elementFiles.appendChild(elementInit)
+    
+        elementfile = doc.createElement('file')
+            
+        elementfile.setAttribute('src',settings.WEB_URL + django.core.urlresolvers.reverse(method, args=url))
+        elementfile.setAttribute('display', '1')
+        if(search):
+            elementfile.setAttribute("segsel",settings.WEB_URL + django.core.urlresolvers.reverse(search, args=url))
+    
+    
+        # /*chemin video : tant que le serveur de media n'est pas up, */
+        elementfile.setAttribute('video', settings.STREAM_URL)
+        elementfile.setAttribute('pict', "")
+        elementfile.setAttribute('extra', "")
+    
+        elementInit.appendChild(elementfile);
+    
+        elementRecent = doc.createElement('recent');
+        elementFiles.appendChild(elementRecent);
+    
+    
+        elementLibrary = doc.createElement('library');
+        elementFiles.appendChild(elementLibrary);
+    
+        username = ''
+        id = ''
+        elementUser = doc.createElement('user')
+        elementUser.setAttribute('name', username)
+        elementUser.setAttribute('id', id)
+        doc.documentElement.appendChild(elementUser)
+        
+        return doc
+
+def create_ldt(project, user):
+    
+    contentList=project.contents.all()
+    
+    """create xml"""
+    
+    # create a dom
+    impl = xml.dom.getDOMImplementation()
+    dom = impl.createDocument(xml.dom.EMPTY_NAMESPACE, 'iri', None)
+    #node project
+    elementProject = dom.createElement('project')
+    dom.documentElement.appendChild(elementProject)
+    
+    
+    elementProject.setAttribute('abstract', "")
+    elementProject.setAttribute('title', project.title)
+    elementProject.setAttribute('user', user.username)
+    elementProject.setAttribute('id', project.ldt_id)
+    #node medias
+    elementMedias = dom.createElement('medias')
+    dom.documentElement.appendChild(elementMedias)
+    
+    idsel = None      
+    for content in contentList:
+        if not idsel:
+            idsel = content.iri_id
+        elementMedia = dom.createElement('media')            
+        elementMedia.setAttribute('id', content.iri_id)
+        elementMedia.setAttribute('src', content.iri_url())
+        if content.videopath and content.videopath !="":
+            elementMedia.setAttribute('video', content.videopath)
+        else:
+            elementMedia.setAttribute('video', settings.STREAM_URL)
+        elementMedia.setAttribute('pict', "")
+        elementMedia.setAttribute('extra', "")
+        elementMedias.appendChild(elementMedia)
+    if not idsel:
+        idsel = ""
+
+    #node annotations
+    elementAnnotations = dom.createElement('annotations')
+    dom.documentElement.appendChild(elementAnnotations)
+    #node displays
+    elementDisplays = dom.createElement('displays')
+    elementDisplay = dom.createElement('display')
+    elementDisplay.setAttribute('id', '0')
+    elementDisplay.setAttribute('title', 'Init view')
+    elementDisplay.setAttribute('idsel', idsel)
+    elementDisplay.setAttribute('tc', '0')
+    elementDisplay.setAttribute('zoom', '0')
+    elementDisplay.setAttribute('scroll', '0')
+    elementDisplay.setAttribute('infoBAB', '')
+    #node content
+    for content in contentList:
+        elementContent = dom.createElement('content')
+        elementContent.setAttribute('id', content.iri_id)
+        if not 'http' in content.iriurl:
+        #eg: "iiiielizabethrosse/ENMI08-III_elizabethrosse.iri"
+            url = content.iri_url()
+        else:
+            url =content.iriurl
+        file = urllib.urlopen(url)
+        doc = xml.dom.minidom.parse(file)
+        con = xml.xpath.Context.Context(doc, 1, 1, None)
+        res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble/decoupage", context=con)
+        #node decoupage
+        for decoupagenode in res:
+            decoupage_id = decoupagenode.getAttribute(u"id")
+            ensemble_id = decoupagenode.parentNode.getAttribute(u"id")
+            elementDecoupage = dom.createElement('decoupage')
+            elementDecoupage.setAttribute('idens', ensemble_id)
+            elementDecoupage.setAttribute('id', decoupage_id)
+            elementContent.appendChild(elementDecoupage)     
+        elementDisplay.appendChild(elementContent)   
+    
+    elementDisplays.appendChild(elementDisplay)
+    dom.documentElement.appendChild(elementDisplays)
+    
+    elementEdits = dom.createElement('edits')
+    dom.documentElement.appendChild(elementEdits)
+    # write dom in Project.ldt 
+    project.ldt = dom.documentElement.toprettyxml()
+    #save Project
+    project.save()
+    return project        
+
+
+def copy_ldt(project, new_project, user):
+    new_project.ldt_id = str(uuid.uuid1())
+    new_project.created_by=user.username
+    new_project.changed_by=user.username
+    new_project.state = 1
+    
+    contentList=project.contents.all()
+    
+    """create xml"""
+    
+    # create a dom
+    dom = xml.dom.minidom.parseString(project.ldt.encode("utf-8"))
+    con = xml.xpath.Context.Context(dom, 1, 1, None)
+    res = xml.xpath.Evaluate("iri/project", context=con)
+    for elementProject in res:
+        elementProject.setAttribute('abstract', "")
+        elementProject.setAttribute('title', new_project.title)
+        elementProject.setAttribute('user', user.username)
+        elementProject.setAttribute('id', new_project.ldt_id)
+        
+    new_project.ldt = dom.documentElement.toprettyxml()
+    #save Project
+    new_project.save()
+    return new_project
+
+def create_empty_iri(file, content, username):
+    
+    writer = MarkupWriter(file, indent = u"yes")
+    writer.startDocument()
+    writer.startElement(u"iri")
+    
+    writer.startElement(u"head")
+    
+    writer.simpleElement(u'meta', attributes={u'name':u'id', 'content':unicode(content.iri_id)})
+    writer.simpleElement(u'meta', attributes={u'name':u'title', 'content':unicode(content.title)})
+    writer.simpleElement(u'meta', attributes={u'name':u'author', 'content':unicode(username)})
+    writer.simpleElement(u'meta', attributes={u'name':u'contributor', 'content':unicode(username)})
+    writer.simpleElement(u'meta', attributes={u'name':u'date', 'content':unicode(datetime.date.today().isoformat())})
+    writer.simpleElement(u'meta', attributes={u'name':u'copyright', 'content':u'IRI'})
+    writer.simpleElement(u'meta', attributes={u'name':u'type', 'content':u'video'})    
+    
+    writer.endElement(u"head")
+
+    writer.startElement(u"body")
+    
+    writer.startElement(u"ensembles")
+    writer.endElement(u"ensembles")
+    
+    writer.simpleElement(u'links')
+    writer.startElement(u"medias")
+
+    writer.startElement(u"media", attributes={u'id':u'video'})
+    writer.simpleElement(u'video', attributes={u'src':unicode(content.src),u'id':unicode(uuid.uuid1()),u'dur':unicode(content.duration),u'begin':u'0'})
+    writer.endElement(u"media")
+
+    writer.startElement(u"media", attributes={u'id':u'tool'})
+    writer.simpleElement(u'tool')
+    writer.endElement(u"media")
+
+    writer.endElement(u"medias")
+    
+    #writer.startElement(u'display', attributes={u'id':unicode(uuid.uuid1()), u'title':u"default", u"idsel":unicode(content.iri_id), u"tc":u"0", u"zoom":u"0", u"scroll":u"0", u"infoBAB":u""})
+    writer.simpleElement(u'display')
+    
+    writer.endElement(u"body")
+
+    
+    writer.endElement(u"iri")
+    writer.endDocument()
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/views.py	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,337 @@
+import django.core.urlresolvers
+from django.http import HttpResponse, HttpResponseRedirect
+from django.shortcuts import render_to_response, get_object_or_404, get_list_or_404
+from django.template import RequestContext
+from django.core.urlresolvers import reverse
+from django.contrib.auth.decorators import login_required
+from django.conf import settings
+from django.core import serializers
+from django.utils import simplejson
+from fileimport import *
+from forms import LdtImportForm, LdtAddForm, SearchForm, AddProjectForm, CopyProjectForm
+from ldt.core.models import Owner
+from models import *
+from utils import *
+from contentindexer import *
+from projectserializer import *
+from string import Template
+from Ft.Xml import MarkupWriter
+import cgi
+import uuid
+import base64
+import lucene
+import xml.dom
+import xml.dom.ext
+import xml.dom.minidom
+
+
+    
+def searchForm(request):
+    form = SearchForm()
+    return render_to_response('ldt/ldt_utils_utils/search_form.html',{'form': form} , context_instance=RequestContext(request))    
+
+def searchIndex(request):
+    
+    sform = SearchForm(request.POST)
+    if sform.is_valid():
+        search = sform.cleaned_data["search"]
+    
+    
+        queryStr = base64.urlsafe_b64encode(search.encode('utf8'))
+        field = request.POST["field"]
+        language_code = request.LANGUAGE_CODE[:2]
+    
+        url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.searchInit", args=[field, queryStr])
+        return render_to_response('ldt/ldt_utils/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': url}, context_instance=RequestContext(request))
+    else:
+        resp = HttpResponse()
+        resp.write("<html><head></head><body>Error : No result</body></html>");
+
+def searchIndexGet(request, field, query):
+
+    language_code = request.LANGUAGE_CODE[:2]
+    url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.searchInit", args=[field, query])
+    return render_to_response('irisuser/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': url}, context_instance=RequestContext(request))
+
+def searchInit(request, field, query):
+    
+    ldtgen = LdtUtils()
+    
+    doc = ldtgen.generateInit([field,query], 'ldt.ldt_utils.views.searchLdt', 'ldt.ldt_utils.views.searchSegments')
+    
+    resp = HttpResponse(mimetype="text/xml;charset=utf-8")
+    xml.dom.ext.PrettyPrint(doc, resp)
+    return resp
+
+def searchLdt(request, field, query, edition=None):
+    
+    contentList = []
+    resp = HttpResponse(mimetype="text/xml")
+    queryStr = ""
+
+    if query and len(query)>0:        
+        queryStr = base64.urlsafe_b64decode(query.encode("ascii")).decode("utf8")
+        searcher = LdtSearch()
+        ids = {}
+        
+        for result in searcher.query(field, queryStr):
+            ids[result["iri_id"]] = ""            
+
+        id_list = ids.keys()
+        
+        if edition is not None:
+            ids_editions = map(lambda t:t[0], filter(lambda id: id[0] is not None, Speak.objects.filter(session__day__edition=edition).order_by("session__start_ts", "order").values_list("content__iri_id")))            
+            id_list = filter(lambda id: id in id_list, ids_editions)
+            
+        contentList = Content.objects.filter(iri_id__in=id_list)        
+
+            
+    ldtgen = LdtUtils()
+    ldtgen.generateLdt(contentList, file=resp, title = u"Recherche : " + queryStr)
+    
+    return resp
+
+
+def searchSegments(request, field, query, edition=None):
+    
+    if query and len(query)>0:
+        searcher = LdtSearch()
+        
+        queryStr = base64.urlsafe_b64decode(query.encode("ascii")).decode("utf8")
+        res = searcher.query(field, queryStr)
+    else:
+        res = []
+        
+    iri_ids = None
+    
+    if edition is not None:
+        iri_ids = map(lambda t:t[0], filter(lambda id: id[0] is not None, Speak.objects.filter(session__day__edition=edition).order_by("session__start_ts", "order").values_list("content__iri_id")))
+
+    doc = xml.dom.getDOMImplementation().createDocument(None, "iri", None)
+
+    for resultMap in res:
+        if iri_ids is None or resultMap['iri_id'] in iri_ids:
+            elem = doc.createElement('seg')
+            elem.setAttribute('idctt', resultMap['iri_id'])
+            elem.setAttribute('idens', resultMap['ensemble_id'])
+            elem.setAttribute('iddec', resultMap['decoupage_id'])
+            elem.setAttribute('idseg', resultMap['element_id'])
+            elem.setAttribute('idvue', "")
+            elem.setAttribute('crit', "")
+            doc.documentElement.appendChild(elem)
+
+    return HttpResponse(doc.toprettyxml(encoding='utf-8'), mimetype="text/xml;charset=utf-8")
+    
+@login_required         
+def list_ldt(request):
+    contents = Content.objects.all()
+    try:
+        owner = Owner.objects.get(user=request.user)
+    except:
+        return HttpResponseRedirect(settings.LOGIN_URL)
+    ldtProjects = Project.objects.filter(owner=owner)
+    context={
+    'contents': contents,
+    'ldtProjects': ldtProjects.reverse(),
+    }
+    return render_to_response('ldt/ldt_utils/ldt_list.html', context, context_instance=RequestContext(request))
+
+def create_ldt_view(request):
+    if request.method == "POST" :
+        form = LdtAddForm(request.POST)
+        if form.is_valid():
+            user = request.user
+            Project.create_project(title=form.cleaned_data['title'], user=user, contents=form.cleaned_data['contents'])
+            return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt"))
+    else:
+        form = LdtAddForm()
+        contents = Content.objects.all()    
+        return render_to_response('ldt/ldt_utils/create_ldt.html', {'contents': contents, 'form': form,'create_project_action':reverse(create_ldt_view)}, context_instance=RequestContext(request))
+     
+def created_ldt(request):
+    return render_to_response('ldt/ldt_utils/done.html', context_instance=RequestContext(request))
+    
+def indexProject(request, id):
+
+    urlStr = settings.WEB_URL + reverse("space_ldt_init", args=['ldtProject', id])
+    posturl= settings.WEB_URL + reverse("ldt.ldt_utils.views.save_ldtProject")
+    language_code = request.LANGUAGE_CODE[:2]
+    
+    ldt = get_object_or_404(Project, ldt_id=id)
+    if ldt.state ==2: #published
+        readonly = 'true'
+    else:
+        readonly = 'false'
+    
+    return render_to_response('ldt/ldt_utils/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': urlStr, 'posturl': posturl, 'id': id, 'readonly': readonly}, context_instance=RequestContext(request))
+    
+def init(request, method, url):
+    ldtgen = LdtUtils()
+
+    doc = ldtgen.generateInit([url], 'ldt.ldt_utils.views.'+method, None)
+
+    resp = HttpResponse(mimetype="text/xml")
+    resp['Cache-Control']='no-cache, must-revalidate'
+    resp['Pragma']='no-cache'
+    xml.dom.ext.PrettyPrint(doc, resp)
+    return resp
+       
+def ldtProject(request, id):
+    resp = HttpResponse(mimetype="text/xml")
+    resp['Cache-Control']='no-cache, must-revalidate'
+    resp['Pragma']='no-cache'
+    
+    project = Project.objects.get(ldt_id=id)
+    resp.write(project.ldt)
+    return resp
+
+
+def project_json_id(request, id):
+    
+    project = get_object_or_404(Project,ldt_id=id)
+
+    return project_json(request, project)
+
+
+def project_json_externalid(request, id):
+        
+    res_proj = get_list_or_404(Project.objects.order_by('-modification_date'),contents__external_id = id)
+    
+    return project_json(request, res_proj[0])
+
+
+
+def project_json(request, project):
+
+    mimetype = request.REQUEST.get("mimetype")
+    if mimetype is None:
+        mimetype = u"application/json; charset=utf-8"
+
+    resp = HttpResponse(mimetype=mimetype)
+    resp['Cache-Control']='no-cache, must-revalidate'
+    resp['Pragma']='no-cache'
+    
+    indent = request.REQUEST.get("indent")
+    if indent is None:
+        indent = settings.LDT_JSON_DEFAULT_INDENT
+    else:
+        indent = int(indent)
+    
+    callback = request.REQUEST.get("callback")
+        
+    ps = ProjectSerializer(project)
+    project_dict = ps.serialize_to_cinelab()
+    
+    json_str = simplejson.dumps(project_dict, ensure_ascii=False, indent=indent)
+    
+    if callback is not None:
+        json_str = "%s(%s)" % (callback,json_str)
+    
+    resp.write(json_str)
+
+    return resp
+
+
+def save_ldtProject(request):
+    if request.method=="POST":
+        ldt = request.POST['ldt']
+        id = request.POST['id']
+        ldtproject=Project.objects.get(ldt_id=id)
+        #save xml ldt
+        ldtproject.ldt=ldt
+        #get new title
+        dom = xml.dom.minidom.parseString(ldt.encode( "utf-8" ))
+        con = xml.xpath.Context.Context(dom, 1, 1, None)
+        result = xml.xpath.Evaluate("/iri/project",context=con)
+        for pnode in result:
+            title=pnode.getAttribute("title")
+            break
+        #set new title
+        ldtproject.title=title
+        #get new content list
+        new_contents=[]
+        result = xml.xpath.Evaluate("/iri/medias/media", context=con)
+        for medianode in result:
+            id = medianode.attributes['id'].value
+            new_contents.append(id)
+        # set new content list
+        for c in ldtproject.contents.all():
+            if not c.iri_id in new_contents:
+                ldtproject.contents.remove(c)           
+        ldtproject.save()
+    else:
+        ldt = ''
+    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):
+    ldt = get_object_or_404(Project, ldt_id=id)
+    ldt.state = 2 #published
+    ldt.save()
+    return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt"))
+    
+@login_required    
+def unpublish(request, id):
+    ldt = get_object_or_404(Project, ldt_id=id)
+    ldt.state = 1 #edition
+    ldt.save()
+    return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt"))
+    
+
+def index(request, url):
+    
+    urlStr = settings.WEB_URL + reverse("ldt_init", args=['ldt',url])
+    language_code = request.LANGUAGE_CODE[:2]
+    
+    return render_to_response('ldt/ldt_utils/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': urlStr, 'weburl':settings.WEB_URL+settings.BASE_URL}, context_instance=RequestContext(request))
+
+
+def ldt(request, url, startSegment = None):
+
+    import Ft
+    from Ft.Xml import MarkupWriter
+    
+    resp = HttpResponse(mimetype="text/xml; charset=utf-8")
+    resp['Cache-Control'] = 'no-cache'
+
+    contentList = Content.objects.filter(iri_id=url)
+
+    ldtgen = LdtUtils()
+    ldtgen.generateLdt(contentList, file=resp, title = contentList[0].title, startSegment=startSegment)
+
+    return resp
+
+
+def loading(request):
+     return render_to_response('ldt/ldt_utils/loading.html', context_instance=RequestContext(request))
+
+
+@login_required
+def create_project(request, iri_id):
+
+    content = get_object_or_404(Content, iri_id=iri_id)
+    contents = [ content, ]
+    if request.method == "POST" :
+        form = AddProjectForm(request.POST)
+        if form.is_valid():
+            user=request.user
+            project = Project.create_project(title=form.cleaned_data['title'], user=user, contents=contents)
+            return HttpResponseRedirect(reverse('ldt.ldt_utils.views.indexProject', args=[project.ldt_id]))
+    else:
+        form = AddProjectForm()
+    return render_to_response('ldt/ldt_utils/create_ldt.html', {'form':form, 'contents':contents, 'iri_id':iri_id, 'create_project_action':reverse("ldt.ldt_utils.views.create_project",args=[iri_id])}, context_instance=RequestContext(request))
+
+@login_required
+def copy_project(request, ldt_id):
+
+    project = get_object_or_404(Project, ldt_id=ldt_id)
+    if request.method == "POST" :
+        form = CopyProjectForm(request.POST)
+        if form.is_valid():
+            user=request.user
+            project = project.copy_project(title=request.POST['title'], user=user)
+            return HttpResponseRedirect(reverse('ldt.ldt_utils.views.indexProject', args=[project.ldt_id]))
+    else:
+        form = CopyProjectForm
+    return render_to_response('ldt/ldt_utils/copy_ldt.html', {'form':form, 'project':project}, context_instance=RequestContext(request))
+
--- a/web/ldt/management/__init__.py	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/ldt/management/__init__.py	Thu Jun 10 19:19:13 2010 +0200
@@ -46,7 +46,7 @@
         return False
         
 def test_ldt():
-    if 'ldt.ldt' in settings.INSTALLED_APPS:
+    if 'ldt.ldt_utils' in settings.INSTALLED_APPS:
         return True
     else:
         return False
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/media/css/dashboard.css	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,5 @@
+
+#content-main-app-ldt-utils {
+    float: left;
+    width: 100%;
+}
\ No newline at end of file
--- a/web/ldt/settings.py	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/ldt/settings.py	Thu Jun 10 19:19:13 2010 +0200
@@ -25,7 +25,9 @@
 
 
 ACCOUNT_ACTIVATION_DAYS =  getattr(settings, 'ACCOUNT_ACTIVATION_DAYS', 7)
-ldt_MEDIA_PREFIX =  getattr(settings, 'ldt_MEDIA_PREFIX', MEDIA_URL + 'ldt/')
+LDT_MEDIA_PREFIX =  getattr(settings, 'LDT_MEDIA_PREFIX', MEDIA_URL + 'ldt/')
+LDT_MAX_SEARCH_NUMBER = 50
+LDT_JSON_DEFAULT_INDENT = 2
 
 
 
--- a/web/ldt/templates/admin/index.html	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/ldt/templates/admin/index.html	Thu Jun 10 19:19:13 2010 +0200
@@ -46,14 +46,14 @@
         	<caption>Import</caption>
         	<tr>
         	<th>        	
-        	<a href="{% url ldt.ldt.views.importFile %}">Import an ldt</a>
+        	<a href="{% url ldt.ldt_utils.views.importFile %}">Import an ldt</a>
         	</th>
         	<td>&nbsp;
         	</td>
             </tr>
         	<tr>
             <th>            
-            <a href="{% url ldt.ldt.views.reindex %}">Reindex</a>
+            <a href="{% url ldt.ldt_utils.views.reindex %}">Reindex</a>
             </th>
             <td>&nbsp;
             </td>         
--- a/web/ldt/templatetags/iriusermedia.py	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-from django.template import Library
-
-register = Library()
-
-def ldt_media_prefix():
-    """ 
-    Returns the string contained in the setting ldt_MEDIA_PREFIX.
-    """
-    try:
-        from django.conf import settings
-    except ImportError:
-        return ''
-    return settings.ldt_MEDIA_PREFIX
-ldt_media_prefix = register.simple_tag(ldt_media_prefix)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/templatetags/ldtmedia.py	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,14 @@
+from django.template import Library
+
+register = Library()
+
+def ldt_media_prefix():
+    """ 
+    Returns the string contained in the setting LDT_MEDIA_PREFIX.
+    """
+    try:
+        from django.conf import settings
+    except ImportError:
+        return ''
+    return settings.LDT_MEDIA_PREFIX
+ldt_media_prefix = register.simple_tag(ldt_media_prefix)
--- a/web/ldt/user/templates/iriuser/user/change_email.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-{% extends "ldt/user/user_base.html" %}
-{# form of email address's change #}
-{% load i18n %}
-{% block breadcrumb %}
-    <li></li>
-    <li><a href="{% url ldt.user.views.profile %}">{% trans "Profiles" %}</a></li>
-    <li>{% trans "Modification de l'adresse émail" %}</li>
-{% endblock %}
-
-{% block content_title %}{% trans "Modification de l'adresse émail" %}{% endblock %}
-{% block js_declaration %}{{ block.super }}
-    <script type="text/javascript">
-        $(document).ready(function() {
-            $("#change_email").validate();
-        });
-    </script>
-{% endblock %}
-{% block css_import %}
-{{ block.super }}
-    <style type="text/css">
-        label.error { float: none; color: red; padding-left: .5em; vertical-align: middle; }
-    </style>
-{% endblock %}
-
-{% block iricontent %}
-<p>{% trans "Please enter your new e-mail twice so we can verify you typed it in correctly." %}</p>
-<form action="" method="POST" id="change_email">
-{% csrf_token %}
-    <table>
-       <tr>
-            <td>
-                <label for="id_email1">{% trans "email" %}:</label>
-            </td>
-            <td>
-                <input id="id_email1" type="text" maxlength="75" name="email1" class="required email"/>
-            </td>
-            <td>{{form.email1.errors}}</td>
-        <tr>
-        </tr>
-            <td>
-                <label for="id_email2">{% trans "Confirmation de l'adresse émail" %}:</label>
-            </td>
-            <td>
-                 <input id="id_email2" type="text" maxlength="75" name="email2" class="required email"/>
-            </td>
-            <td>{{form.email1.errors}}</td>
-        </tr>
-        <tr><th></th><td><input type="submit" class="button" name="submit" value="{% trans 'change my e-mail' %}" /></td></tr>
-    </table>
-</form>
-{% endblock%}
--- a/web/ldt/user/templates/iriuser/user/change_email_done.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-{% extends "ldt/user/user_base.html" %}
-{# if email is changed successfully, retrun this page #}
-{% load i18n %}
-{% block breadcrumb %}
-    <li></li>
-    <li><a href="{% url ldt.user.views.profile %}">{% trans "Profiles" %}</a></li>
-    <li>{% trans "email change" %}</li>
-{% endblock %}
-
-{% block content_title %}{% trans "email change" %}{% endblock %}
-{% block iricontent %}
-<p> {% trans "email changed" %}</p>
-<a href="{% url ldt.user.views.profile %}">{% trans "back to profile" %}</a>
-{% endblock %}
--- a/web/ldt/user/templates/iriuser/user/home.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-{% extends "base.html" %}
-{% load i18n %}
-
-{% block title %}Home{% endblock %}
-
-{% block content_base %}
-
-<p>Welcome</p>
-<li><a href="{% url django.contrib.auth.views.login  %}" >{% trans "Se connecter" %}</a></li>
-<li><a href="{% url registration.views.register  %}" >{% trans "Créer un compte" %}</a></li>
-<li><a href="{% url django.contrib.auth.views.password_reset  %}" >{% trans "récupérer mot de passe" %}</a></li>
-
-{% endblock %} 
-
--- a/web/ldt/user/templates/iriuser/user/login_form.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-{% load i18n %}
-{# print user's state and form of login #}
-{% block js_import %}
-{{block.super}}
-
-    <script language="javascript">
-    var url_login_ajax='{{WEB_URL}}{% url ldt.user.views.loginAjax %}';
-    {% if reload %}    
-        var reload=true;    
-    {% else %}
-        var reload=false;  
-    {% endif %}
-
-    $(document).ready(function(){
-        $('.login_link').nyroModal({
-                height:235, 
-                width:430, 
-                padding:0,
-                bgColor: 'rgb(239, 239, 239)',
-                });
-        })
-
-    </script>
-{% endblock %}
-{% 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>
-            <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">
-                <a href="#" class="nyroModalClose">X</a>
-                <div>{% trans "Log in" %}</div>             
-            </div>
-            <div id="msg"></div>
-            <div id="login_form" style="padding: 8px;" method="POST" action="">
-                <div style="float: right; padding-bottom: 8px;">
-                    <a href="{% url registration.views.register  %}" >{% trans "create account" %}</a>
-                </div>
-                <dl style="clear: both;">
-                    
-                    <dt><label for="username">{% trans "Pseudo" %}:</label></dt>
-                    <dd>
-                        <input class= "inputbox" type="text" style="width:148px" name="username" value="" id="username">
-                        <div id="login_form_username_error" class="ajaxform_error">{% trans "this field is compulsory" %}</div>
-                    </dd>
-               
-                
-                    <dt><label for="password">{% trans "Password" %}: </label></dt>
-                    <dd>
-                        <input class= "inputbox" type="password" style="width:148px" name="password" value="" id="password" >
-                        <div id="login_form_password_error" class="ajaxform_error">{% trans "this field is compulsory" %}</div>
-                    </dd>
-                    <dt/>
-                    <dd>
-                        <a href="{% url django.contrib.auth.views.password_reset  %}" >{% trans "reset password" %}</a>
-                    </dd>
-                </dl>
-                <input class="button" id="submit" type="submit" value="{% trans 'Connection' %}"/>  
-            </div>
-
-        </div>
-</div>
--- a/web/ldt/user/templates/iriuser/user/profile.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-{% extends "ldt/user/user_base.html" %}
-{# user's profiles(change password, change email) #}
-{% load i18n %}
-{% block  iricontent %}
-<ul>
-    <li><a href="{% url django.contrib.auth.views.password_change %}" >{% trans "Password change" %}</a></li>
-    <li><a href="{% url ldt.user.views.change_email%}">{% trans "Mail change" %}</a></li>
-</ul>
-{% endblock %} 
--- a/web/ldt/user/templates/iriuser/user/space.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-{% extends "ldt/user/user_base.html" %}
-{# user's space (edit page or project lignes de temps) #}
-{% load i18n %}
-{% block breadcrumb %}
-    <li></li>
-    <li>{% trans "Space" %}</li>    
-{% endblock %}
-
-{% block content_title %}{% trans "Space" %}{% endblock %}
-{% block iricontent%}
-<ul>
-{% if cms %}
-    <li><a href="{% url admin:page %}">{% trans "Page" %}</a></li>
-{% endif %}
-{% if ldt %}
-    <li><a href="{% url ldt.ldt.views.list_ldt %}">{% trans "Projets Lignes de temps" %}</a></li>
-{% endif %}
-</ul>      
-{% endblock %}
--- a/web/ldt/user/templates/iriuser/user/user_base.html	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-{% extends "base.html" %}
-{# this page inherit base html, all pages of ldt inherit this page. #}
-{# all contents are writed in the "iricontent" block  #}
-{% load i18n %}
-{% block js_import %}{{ block.super }}
-{% endblock %}
-{% block css_import %}{{ block.super }}
-{% endblock%}
-
-
-{% block content %}
-    <div id="iri-user-content">
-        {% block iricontent %}{% endblock %}
-    </div>
-{% endblock%}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/user/templates/ldt/user/change_email.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,51 @@
+{% extends "ldt/user/user_base.html" %}
+{# form of email address's change #}
+{% load i18n %}
+{% block breadcrumb %}
+    <li></li>
+    <li><a href="{% url ldt.user.views.profile %}">{% trans "Profiles" %}</a></li>
+    <li>{% trans "Modification de l'adresse émail" %}</li>
+{% endblock %}
+
+{% block content_title %}{% trans "Modification de l'adresse émail" %}{% endblock %}
+{% block js_declaration %}{{ block.super }}
+    <script type="text/javascript">
+        $(document).ready(function() {
+            $("#change_email").validate();
+        });
+    </script>
+{% endblock %}
+{% block css_import %}
+{{ block.super }}
+    <style type="text/css">
+        label.error { float: none; color: red; padding-left: .5em; vertical-align: middle; }
+    </style>
+{% endblock %}
+
+{% block iricontent %}
+<p>{% trans "Please enter your new e-mail twice so we can verify you typed it in correctly." %}</p>
+<form action="" method="POST" id="change_email">
+{% csrf_token %}
+    <table>
+       <tr>
+            <td>
+                <label for="id_email1">{% trans "email" %}:</label>
+            </td>
+            <td>
+                <input id="id_email1" type="text" maxlength="75" name="email1" class="required email"/>
+            </td>
+            <td>{{form.email1.errors}}</td>
+        <tr>
+        </tr>
+            <td>
+                <label for="id_email2">{% trans "Confirmation de l'adresse émail" %}:</label>
+            </td>
+            <td>
+                 <input id="id_email2" type="text" maxlength="75" name="email2" class="required email"/>
+            </td>
+            <td>{{form.email1.errors}}</td>
+        </tr>
+        <tr><th></th><td><input type="submit" class="button" name="submit" value="{% trans 'change my e-mail' %}" /></td></tr>
+    </table>
+</form>
+{% endblock%}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/user/templates/ldt/user/change_email_done.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,14 @@
+{% extends "ldt/user/user_base.html" %}
+{# if email is changed successfully, retrun this page #}
+{% load i18n %}
+{% block breadcrumb %}
+    <li></li>
+    <li><a href="{% url ldt.user.views.profile %}">{% trans "Profiles" %}</a></li>
+    <li>{% trans "email change" %}</li>
+{% endblock %}
+
+{% block content_title %}{% trans "email change" %}{% endblock %}
+{% block iricontent %}
+<p> {% trans "email changed" %}</p>
+<a href="{% url ldt.user.views.profile %}">{% trans "back to profile" %}</a>
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/user/templates/ldt/user/home.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,14 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block title %}Home{% endblock %}
+
+{% block content_base %}
+
+<p>Welcome</p>
+<li><a href="{% url django.contrib.auth.views.login  %}" >{% trans "Se connecter" %}</a></li>
+<li><a href="{% url registration.views.register  %}" >{% trans "Créer un compte" %}</a></li>
+<li><a href="{% url django.contrib.auth.views.password_reset  %}" >{% trans "récupérer mot de passe" %}</a></li>
+
+{% endblock %} 
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/user/templates/ldt/user/login_form.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,75 @@
+{% load i18n %}
+{# print user's state and form of login #}
+{% block js_import %}
+{{block.super}}
+
+    <script language="javascript">
+    var url_login_ajax='{{WEB_URL}}{% url ldt.user.views.loginAjax %}';
+    {% if reload %}    
+        var reload=true;    
+    {% else %}
+        var reload=false;  
+    {% endif %}
+
+    $(document).ready(function(){
+        $('.login_link').nyroModal({
+                height:235, 
+                width:430, 
+                padding:0,
+                bgColor: 'rgb(239, 239, 239)',
+                });
+        })
+
+    </script>
+{% endblock %}
+{% 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>
+            <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">
+                <a href="#" class="nyroModalClose">X</a>
+                <div>{% trans "Log in" %}</div>             
+            </div>
+            <div id="msg"></div>
+            <div id="login_form" style="padding: 8px;" method="POST" action="">
+                <div style="float: right; padding-bottom: 8px;">
+                    <a href="{% url registration.views.register  %}" >{% trans "create account" %}</a>
+                </div>
+                <dl style="clear: both;">
+                    
+                    <dt><label for="username">{% trans "Pseudo" %}:</label></dt>
+                    <dd>
+                        <input class= "inputbox" type="text" style="width:148px" name="username" value="" id="username">
+                        <div id="login_form_username_error" class="ajaxform_error">{% trans "this field is compulsory" %}</div>
+                    </dd>
+               
+                
+                    <dt><label for="password">{% trans "Password" %}: </label></dt>
+                    <dd>
+                        <input class= "inputbox" type="password" style="width:148px" name="password" value="" id="password" >
+                        <div id="login_form_password_error" class="ajaxform_error">{% trans "this field is compulsory" %}</div>
+                    </dd>
+                    <dt/>
+                    <dd>
+                        <a href="{% url django.contrib.auth.views.password_reset  %}" >{% trans "reset password" %}</a>
+                    </dd>
+                </dl>
+                <input class="button" id="submit" type="submit" value="{% trans 'Connection' %}"/>  
+            </div>
+
+        </div>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/user/templates/ldt/user/profile.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,9 @@
+{% extends "ldt/user/user_base.html" %}
+{# user's profiles(change password, change email) #}
+{% load i18n %}
+{% block  iricontent %}
+<ul>
+    <li><a href="{% url django.contrib.auth.views.password_change %}" >{% trans "Password change" %}</a></li>
+    <li><a href="{% url ldt.user.views.change_email%}">{% trans "Mail change" %}</a></li>
+</ul>
+{% endblock %} 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/user/templates/ldt/user/space.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,19 @@
+{% extends "ldt/user/user_base.html" %}
+{# user's space (edit page or project lignes de temps) #}
+{% load i18n %}
+{% block breadcrumb %}
+    <li></li>
+    <li>{% trans "Space" %}</li>    
+{% endblock %}
+
+{% block content_title %}{% trans "Space" %}{% endblock %}
+{% block iricontent%}
+<ul>
+{% if cms %}
+    <li><a href="{% url admin:page %}">{% trans "Page" %}</a></li>
+{% endif %}
+{% if ldt %}
+    <li><a href="{% url ldt.ldt_utils.views.list_ldt %}">{% trans "Projets Lignes de temps" %}</a></li>
+{% endif %}
+</ul>      
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/user/templates/ldt/user/user_base.html	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,15 @@
+{% extends "base.html" %}
+{# this page inherit base html, all pages of ldt inherit this page. #}
+{# all contents are writed in the "iricontent" block  #}
+{% load i18n %}
+{% block js_import %}{{ block.super }}
+{% endblock %}
+{% block css_import %}{{ block.super }}
+{% endblock%}
+
+
+{% block content %}
+    <div id="iri-user-content">
+        {% block iricontent %}{% endblock %}
+    </div>
+{% endblock%}
--- a/web/ldt/user/templates/registration/registration_form.html	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/ldt/user/templates/registration/registration_form.html	Thu Jun 10 19:19:13 2010 +0200
@@ -12,7 +12,7 @@
 {% block iricontent%}
 <form class="signupform" id="signup_form" method="post" action=""> {% csrf_token %}
                 <ul>
-{{form.as_ul}}
+				{{form.as_ul}}
                 <li><input class="button" type="submit" value="{% trans 'Save' %} "/></li>
                 </ul>
 </form>
--- a/web/ldt/user/urls.py	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/ldt/user/urls.py	Thu Jun 10 19:19:13 2010 +0200
@@ -7,13 +7,13 @@
     url(r'^space/$', 'ldt.user.views.space'),
     url(r'^emailchange/$', 'ldt.user.views.change_email'),
     url(r'^emailchange/done/$', 'ldt.user.views.change_email_done'),
-#    url(r'^space/ldt/$', 'ldt.ldt.views.list_ldt'),
-#    url(r'^space/ldt/indexproject/(?P<id>.*)$', 'ldt.ldt.views.indexProject'),
-#    url(r'^space/ldt/init/(?P<method>.*)/(?P<url>.*)$', 'ldt.ldt.views.init'),
-#    url(r'^space/ldt/project/(?P<id>.*)$', 'ldt.ldt.views.ldtProject'),
-#    url(r'^space/ldt/create/$', 'ldt.ldt.views.create_ldt_view'),
-#    url(r'^space/ldt/created_done/$', 'ldt.ldt.views.created_ldt'),
-#    url(r'^space/ldt/save/$', 'ldt.ldt.views.save_ldtProject'),
-#    url(r'^space/ldt/publish/(?P<id>.*)$', 'ldt.ldt.views.publish'),
-#    url(r'^space/ldt/unpublish/(?P<id>.*)$', 'ldt.ldt.views.unpublish'),
+#    url(r'^space/ldt/$', 'ldt.ldt_utils.views.list_ldt'),
+#    url(r'^space/ldt/indexproject/(?P<id>.*)$', 'ldt.ldt_utils.views.indexProject'),
+#    url(r'^space/ldt/init/(?P<method>.*)/(?P<url>.*)$', 'ldt.ldt_utils.views.init'),
+#    url(r'^space/ldt/project/(?P<id>.*)$', 'ldt.ldt_utils.views.ldtProject'),
+#    url(r'^space/ldt/create/$', 'ldt.ldt_utils.views.create_ldt_view'),
+#    url(r'^space/ldt/created_done/$', 'ldt.ldt_utils.views.created_ldt'),
+#    url(r'^space/ldt/save/$', 'ldt.ldt_utils.views.save_ldtProject'),
+#    url(r'^space/ldt/publish/(?P<id>.*)$', 'ldt.ldt_utils.views.publish'),
+#    url(r'^space/ldt/unpublish/(?P<id>.*)$', 'ldt.ldt_utils.views.unpublish'),
 )
--- a/web/ldt/utils/context_processors.py	Thu Jun 10 19:15:21 2010 +0200
+++ b/web/ldt/utils/context_processors.py	Thu Jun 10 19:19:13 2010 +0200
@@ -1,4 +1,4 @@
 from django.conf import settings
 
 def ldt(request):
-    return {'ldt_MEDIA_PREFIX': settings.ldt_MEDIA_PREFIX }
+    return {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX }
--- a/web/static/iriuser/css/ldt.css	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-#addldtform
-{
-    font-size: 16px;
-    background: #ffffff scroll repeat 0 0;
-    border: 1px solid #666666;
-    text-align: left;
-    width: 700px;
-}
-
-#addldtform .title
-{
-    color: #666666;
-    font-weight:bold !important;
-    font-size:16px;
-    position: relative;
-    padding:8px 12px;
-}
-
-#addldtform .title .closebutton
-{
-    float: right;
-    text-decoration: none;
-    color:#666666;
-}
-
-
-#addldtform .form-row
-{
-    border-bottom: 1px solid #eeeeee;
-    font-size: 15px;
-    padding: 8px 12px;
-}
-
-#addldtform label
-{
-    float: left;
-    padding: 3px 8px 0 0;
-    width:8em;
-    color: #333333 !important;
-    font-weight: bold !important;
-}
-#addldtform input
-{
-    font-size: 15px;
-    font-weight: normal;
-    padding:2px 3px;
-    vertical-align: middle;
-    margin : 2px 0;
-    background-color: #ffffff;
-    border: 1px solid #cccccc;
-}
-
-#addldtform  .checkbox
-{
-    padding: 6px 3px 3px 30px;
-}
-
-#addldtform .submit-row input
-{
-    color:black;
-    border-color:#DDDDDD #AAAAAA #AAAAAA #DDDDDD;
-    background:#dddddd;
-    padding: 3px;
-    margin:0 10px 10px 10px;
-}
-/*
-#ldtlist{
-    width:60%;
-    overflow:auto;
-    padding:1em;
-}
-*/
-#ldtlist table {
-    border-collapse: collapse;
-    border-color: #ccc;
-    width:100%;
-}
-#ldtlist table caption{
-    color:black;
-    font-size:15px;
-    font-weight:bold;
-    padding:5px;
-    text-align:left;
-    text-transform:uppercase;
-}
-#ldtlist td, th {
-    font-size: 11px;
-    line-height: 13px;
-    border-bottom: 1px solid #eee;
-    vertical-align: top;
-    padding: 5px;
-    font-family: "Lucida Grande", Verdana, Arial, sans-serif;
-}
-
-
-#ldtlist table thead {
-    color: #666;
-    padding: 2px 5px;
-    font-size: 13px;
-    background: #e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x;
-    border-left: 1px solid #ddd;
-    border-bottom: 1px solid #ddd;
-    white-space: nowrap;
-    vertical-align: middle;
-    font-weight: bold;
-    text-align: center;
-}
-
-#ldtlist table tbody td {
-    border-left: 1px solid #ddd;
-    text-align: center;
-}
-
-#ldtlist table tbody td:first-child {
-    border-left: 0;
-    border-right: 1px solid #ddd;
-    text-align: left;
-}
-
-#ldtlist table tfoot {
-    color: #666;
-}
--- a/web/static/iriuser/css/style.css	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-#loginstate a, #loginstate a:hover, #loginstate a:visited, #loginstate a:link, #loginstate a:active {
-    color:#0063DC;
-    margin-right:4px;
-    text-decoration:none;
-}
-
-#loginstate a:hover{
-    text-decoration: underline;
-}
-
-#loginstate ul {
-    margin:0;
-    padding:0;
-    float: left;
-}
-#loginstate li{
-    display: inline;
-    padding:0;
-    margin:0;
-}
-#loginstate #user{
-    color: #000000;
-    font-weight: bold;
-    margin-right:4px;
-}
-#loginstate ul .usertool a,
-#loginstate ul .usertool a:link, 
-#loginstate ul .usertool a:visited {
-    color:#0063DC;
-    text-decoration:none;
-}
-
-#loginstate ul .usertool a:hover {
-    color:#0063DC;
-    text-decoration:underline;
-}
-
-.errorlist
-{
-    color: red;
-    font-size:12px
-}
-
-
-
-
-
--- a/web/static/iriuser/css/style_base.css	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-body
-{   font-family: Arial, Helvetica, sans serif;
-    padding: 0px;
-    margin: 0px;
-    background-color: #f9f9f9;
-    font-size: 12px;
-}
-
-a
-{
-    color: #0045A3;
-    text-decoration:none;
-}
-
-a:hover
-{
-    color: #990000;
-    text-decoration: underline;
-}
-
-p
-{
-    font-size:12px;
-    font-weight:normal;
-    margin:0;
-    padding:0;
-}
-
-th
-{
-   text-align: left; 
-}
-.button
-{
-    margin: 3px 0;
-    margin-left: 25px;
-    background: #3366CC;
-    padding: 0 6px;
-    border-color: #6699CC #3366CC #3366CC #6699CC;
-    border-style: solid;
-    border-width: 1px 2px 2px 1px;
-    font-size: 13px;
-    font-style: normal;
-    font-weight: bold;
-    color: #ffffff;
-}
-
-.errorlist
-{
-    color: red;
-    font-size:12px
-}
-#header
-{
-    background-color: #ffffcc;
-    height: 50px;
-}
-
-#logo
-{
-}
-
-#usertool
-{
-}
-
-#loginstate
-{
-    color:#0045A3;
-}
-
-#menu
-{
-   width: 200px;
-   vertical-align: top;
-}
-
-#container
-{
-  width: 90%;
-  margin: 10px auto;
-  background-color: #fff;
-  color: #000;
-}
-}
-#content
-{
-}
-
-#footer
-{    
-}
-
-/* page login *//*
-#loginarea
-{
-    margin: 0 auto;
-    margin-top: 100px;
-    overflow: hidden;
-    width: 362px;
-    border: 2px solid #CCCCCC;
-}
-
-#loginarea .title
-{
-    font-size: 15px;
-    color: #FFFFFF;
-    background: #990000 scroll repeat left top;
-    font-weight:bold;
-    height:34px;
-    position: relative;
-    line-height: 34px;
-    overflow: hidden;
-    text-transform: uppercase;
-}
-
-#loginarea .title div
-{
-    margin-left: 12px;
-}
-
-#loginarea .login-form
-{
-    margin-top:20px;
-    margin-left:25px;
-} 
-
-#loginarea .login-form .inputbox
-{
-    font-size: 13px;
-    line-height:20px;
-    text-align: left; 
-}
-
-#loginarea .login-form label
-{
-    font-size: 14px;
-    font-weight: bold;
-}
-/*
-#loginarea .login-form .button
-{
-    margin: 3px 0;
-    margin-left: 25px;
-    background: #3366CC;
-    padding: 0 6px;
-    border-color: #6699CC #3366CC #3366CC #6699CC;
-    border-style: solid;
-    border-width: 1px 2px 2px 1px;
-    font-size: 13px;
-    font-style: normal;
-    font-weight: bold;
-    color: #ffffff;
-}
-
-#loginarea a
-{
-    font-size: 12px;
-    background:url("norm_left.gif") no-repeat left top;
-    padding:5px 15px;
-    margin: 5px;
-}
-
-#nav {
-    float:left;
-    width:100%;
-    font-size:93%;
-    line-height:normal;
-    background:#828282 repeat-x scroll 0 0;
-    margin:0;
-    padding:0;
-    list-style:none;
-}
-
-#nav a:link, 
-#nav a:visited {
-    color:#fff;
-    background:#828282 repeat-x scroll 0 0;
-    padding:20px 40px 4px 10px;
-    float:left;
-    width:auto;
-    border-right:1px solid #999999;
-}
-
-#nav li a:hover {
-    color:#fff;
-    background:#999999 none repeat scroll 0 0;
-}
-
-#space #nav-space a, #profile  #nav-profile a
-{
-    background:#666666 none repeat scroll 0 0;
-}
-
-#space  #nav-space, #profile  #nav-profile
-{
-    background:#666666 none repeat scroll 0 0;
-    color:#FFFFFF;
-}
-*/
-
-
Binary file web/static/iriuser/img/loadingAnimation.gif has changed
--- a/web/static/iriuser/js/jquery.DOMWindow.js	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,372 +0,0 @@
-(function($){
-	
-	//closeDOMWindow
-	$.fn.closeDOMWindow = function(settings){
-		
-		if(!settings){settings={};}
-		
-		var run = function(passingThis){
-			
-			if(settings.anchoredClassName){
-				var $anchorClassName = $('.'+settings.anchoredClassName);
-				$anchorClassName.fadeOut('fast',function(){
-					if($.fn.draggable){
-						$anchorClassName.draggable('destory').trigger("unload").remove();	
-					}else{
-						$anchorClassName.trigger("unload").remove();
-					}
-				});
-				if(settings.functionCallOnClose){settings.functionCallAfterClose();}
-			}else{
-				var $DOMWindowOverlay = $('#DOMWindowOverlay');
-				var $DOMWindow = $('#DOMWindow');
-				$DOMWindowOverlay.fadeOut('fast',function(){
-					$DOMWindowOverlay.trigger('unload').unbind().remove();																	  
-				});
-				$DOMWindow.fadeOut('fast',function(){
-					if($.fn.draggable){
-						$DOMWindow.draggable("destroy").trigger("unload").remove();
-					}else{
-						$DOMWindow.trigger("unload").remove();
-					}
-				});
-			
-				$(window).unbind('scroll.DOMWindow');
-				$(window).unbind('resize.DOMWindow');
-				
-				if($.fn.openDOMWindow.isIE6){$('#DOMWindowIE6FixIframe').remove();}
-				if(settings.functionCallOnClose){settings.functionCallAfterClose();}
-			}	
-		};
-		
-		if(settings.eventType){//if used with $().
-			return this.each(function(index){
-				$(this).bind(settings.eventType, function(){
-					run(this);
-					return false;
-				});
-			});
-		}else{//else called as $.function
-			run();
-		}
-		
-	};
-	
-	//allow for public call, pass settings
-	$.closeDOMWindow = function(s){$.fn.closeDOMWindow(s);};
-	
-	//openDOMWindow
-	$.fn.openDOMWindow = function(instanceSettings){	
-		
-		var shortcut =  $.fn.openDOMWindow;
-	
-		//default settings combined with callerSettings////////////////////////////////////////////////////////////////////////
-		
-		shortcut.defaultsSettings = {
-			anchoredClassName:'',
-			anchoredSelector:'',
-			borderColor:'#ccc',
-			borderSize:'4',
-			draggable:0,
-			eventType:null, //click, blur, change, dblclick, error, focus, load, mousedown, mouseout, mouseup etc...
-			fixedWindowY:100,
-			functionCallOnOpen:null,
-			functionCallOnClose:null,
-			height:500,
-			loader:0,
-			loaderHeight:0,
-			loaderImagePath:'',
-			loaderWidth:0,
-			modal:0,
-			overlay:1,
-			overlayColor:'#000',
-			overlayOpacity:'85',
-			positionLeft:0,
-			positionTop:0,
-			positionType:'centered', // centered, anchored, absolute, fixed
-			width:500, 
-			windowBGColor:'#fff',
-			windowBGImage:null, // http path
-			windowHTTPType:'get',
-			windowPadding:10,
-			windowSource:'inline', //inline, ajax, iframe
-			windowSourceID:'',
-			windowSourceURL:'',
-			windowSourceAttrURL:'href',
-			windowOverflow : 'auto',
-			ajaxParameters : {}
-		};
-		
-		var settings = $.extend({}, $.fn.openDOMWindow.defaultsSettings , instanceSettings || {});
-		
-		//Public functions
-		
-		shortcut.viewPortHeight = function(){ return self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;};
-		shortcut.viewPortWidth = function(){ return self.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;};
-		shortcut.scrollOffsetHeight = function(){ return self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;};
-		shortcut.scrollOffsetWidth = function(){ return self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;};
-		shortcut.isIE6 = typeof document.body.style.maxHeight === "undefined";
-		
-		//Private Functions/////////////////////////////////////////////////////////////////////////////////////////////////////////
-		
-		var sizeOverlay = function(){
-			var $DOMWindowOverlay = $('#DOMWindowOverlay');
-			if(shortcut.isIE6){//if IE 6
-				var overlayViewportHeight = document.documentElement.offsetHeight + document.documentElement.scrollTop - 4;
-				var overlayViewportWidth = document.documentElement.offsetWidth - 21;
-				$DOMWindowOverlay.css({'height':overlayViewportHeight +'px','width':overlayViewportWidth+'px'});
-			}else{//else Firefox, safari, opera, IE 7+
-				$DOMWindowOverlay.css({'height':'100%','width':'100%','position':'fixed'});
-			}	
-		};
-		
-		var sizeIE6Iframe = function(){
-			var overlayViewportHeight = document.documentElement.offsetHeight + document.documentElement.scrollTop - 4;
-			var overlayViewportWidth = document.documentElement.offsetWidth - 21;
-			$('#DOMWindowIE6FixIframe').css({'height':overlayViewportHeight +'px','width':overlayViewportWidth+'px'});
-		};
-		
-		var centerDOMWindow = function() {
-			var $DOMWindow = $('#DOMWindow');
-			if(settings.height + 50 > shortcut.viewPortHeight()){//added 50 to be safe
-				$DOMWindow.css('left',Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindow.outerWidth())/2));
-			}else{
-				$DOMWindow.css('left',Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindow.outerWidth())/2));
-				$DOMWindow.css('top',Math.round(shortcut.viewPortHeight()/2) + shortcut.scrollOffsetHeight() - Math.round(($DOMWindow.outerHeight())/2));
-			}
-		};
-		
-		var centerLoader = function() {
-			var $DOMWindowLoader = $('#DOMWindowLoader');
-			if(shortcut.isIE6){//if IE 6
-				$DOMWindowLoader.css({'left':Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindowLoader.innerWidth())/2),'position':'absolute'});
-				$DOMWindowLoader.css({'top':Math.round(shortcut.viewPortHeight()/2) + shortcut.scrollOffsetHeight() - Math.round(($DOMWindowLoader.innerHeight())/2),'position':'absolute'});
-			}else{
-				$DOMWindowLoader.css({'left':'50%','top':'50%','position':'fixed'});
-			}
-			
-		};
-		
-		var fixedDOMWindow = function(){
-			var $DOMWindow = $('#DOMWindow');
-			$DOMWindow.css('left', settings.positionLeft + shortcut.scrollOffsetWidth());
-			$DOMWindow.css('top', + settings.positionTop + shortcut.scrollOffsetHeight());
-		};
-		
-		var showDOMWindow = function(instance){
-			if(arguments[0]){
-				$('.'+instance+' #DOMWindowLoader').remove();
-				$('.'+instance+' #DOMWindowContent').fadeIn('fast',function(){if(settings.functionCallOnOpen){settings.functionCallOnOpen();}});
-				$('.'+instance+ '.closeDOMWindow').click(function(){
-					$.closeDOMWindow();	
-					return false;
-				});
-			}else{
-				$('#DOMWindowLoader').remove();
-				$('#DOMWindow').fadeIn('fast',function(){if(settings.functionCallOnOpen){settings.functionCallOnOpen();}});
-				$('#DOMWindow .closeDOMWindow').click(function(){						
-					$.closeDOMWindow();
-					return false;
-				});
-			}
-			
-		};
-		
-		var urlQueryToObject = function(s, q){
-			  var query = typeof(q) != 'undefined' ? q : {};
-			  s.replace(/b([^&=]*)=([^&=]*)b/g, function (m, a, d) {
-				if (typeof query[a] != 'undefined') {
-				  query[a] += ',' + d;
-				} else {
-				  query[a] = d;
-				}
-			  });
-			  return query;
-		};
-			
-		//Run Routine ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
-		var run = function(passingThis){
-			
-			//get values from element clicked, or assume its passed as an option
-			settings.windowSourceID = $(passingThis).attr('href') || settings.windowSourceID;
-			settings.windowSourceURL = $(passingThis).attr(settings.windowSourceAttrURL) || settings.windowSourceURL;
-			settings.windowBGImage = settings.windowBGImage ? 'background-image:url('+settings.windowBGImage+')' : '';
-			var urlOnly, urlQueryObject;
-			
-			if(settings.positionType == 'anchored'){//anchored DOM window
-				
-				var anchoredPositions = $(settings.anchoredSelector).position();
-				var anchoredPositionX = anchoredPositions.left + settings.positionLeft;
-				var anchoredPositionY = anchoredPositions.top + settings.positionTop;
-				
-				$('body').append('<div class="'+settings.anchoredClassName+'" style="'+settings.windowBGImage+';background-repeat:no-repeat;padding:'+settings.windowPadding+'px;overflow:'+settings.windowOverflow+';position:absolute;top:'+anchoredPositionY+'px;left:'+anchoredPositionX+'px;height:'+settings.height+'px;width:'+settings.width+'px;background-color:'+settings.windowBGColor+';border:'+settings.borderSize+'px solid '+settings.borderColor+';z-index:10001"><div id="DOMWindowContent" style="display:none"></div></div>');		
-				//loader
-				if(settings.loader && settings.loaderImagePath !== ''){
-					$('.'+settings.anchoredClassName).append('<div id="DOMWindowLoader" style="width:'+settings.loaderWidth+'px;height:'+settings.loaderHeight+'px;"><img src="'+settings.loaderImagePath+'" /></div>');
-					
-				}
-
-				if($.fn.draggable){
-					if(settings.draggable){$('.' + settings.anchoredClassName).draggable({cursor:'move'});}
-				}
-				
-				switch(settings.windowSource){
-					case 'inline'://////////////////////////////// inline //////////////////////////////////////////
-						$('.' + settings.anchoredClassName+" #DOMWindowContent").append($(settings.windowSourceID).children());
-						$('.' + settings.anchoredClassName).unload(function(){// move elements back when you're finished
-							$('.' + settings.windowSourceID).append( $('.' + settings.anchoredClassName+" #DOMWindowContent").children());				
-						});
-						showDOMWindow(settings.anchoredClassName);
-					break;
-					case 'iframe'://////////////////////////////// iframe //////////////////////////////////////////
-						$('.' + settings.anchoredClassName+" #DOMWindowContent").append('<iframe frameborder="0" hspace="0" wspace="0" src="'+settings.windowSourceURL+'" name="DOMWindowIframe'+Math.round(Math.random()*1000)+'" style="width:100%;height:100%;border:none;background-color:#fff;overflow:'+settings.windowOverflow+';" class="'+settings.anchoredClassName+'Iframe" ></iframe>');
-						$('.'+settings.anchoredClassName+'Iframe').load(showDOMWindow(settings.anchoredClassName));
-					break;
-					case 'ajax'://////////////////////////////// ajax //////////////////////////////////////////	
-						if(settings.windowHTTPType == 'post'){
-							
-							if(settings.windowSourceURL.indexOf("?") !== -1){//has a query string
-								urlOnly = settings.windowSourceURL.substr(0, settings.windowSourceURL.indexOf("?"));
-								urlQueryObject = urlQueryToObject(settings.windowSourceURL, settings.ajaxParameters);
-							}else{
-								urlOnly = settings.windowSourceURL;
-								urlQueryObject = settings.ajaxParameters;
-							}
-							$('.' + settings.anchoredClassName+" #DOMWindowContent").load(urlOnly,urlQueryObject,function(){
-								showDOMWindow(settings.anchoredClassName);
-							});
-						}else{
-							if(settings.windowSourceURL.indexOf("?") == -1){ //no query string, so add one
-								settings.windowSourceURL += '?';
-							}
-							$('.' + settings.anchoredClassName+" #DOMWindowContent").load(
-								settings.windowSourceURL + '&random=' + (new Date().getTime()),function(){
-								showDOMWindow(settings.anchoredClassName);
-							});
-						}
-					break;
-				}
-				
-			}else{//centered, fixed, absolute DOM window
-				
-				//overlay & modal
-				if(settings.overlay){
-					$('body').append('<div id="DOMWindowOverlay" style="z-index:10000;display:none;position:absolute;top:0;left:0;background-color:'+settings.overlayColor+';filter:alpha(opacity='+settings.overlayOpacity+');-moz-opacity: 0.'+settings.overlayOpacity+';opacity: 0.'+settings.overlayOpacity+';"></div>');
-					if(shortcut.isIE6){//if IE 6
-						$('body').append('<iframe id="DOMWindowIE6FixIframe"  src="blank.html"  style="width:100%;height:100%;z-index:9999;position:absolute;top:0;left:0;filter:alpha(opacity=0);"></iframe>');
-						sizeIE6Iframe();
-					}
-					sizeOverlay();
-					var $DOMWindowOverlay = $('#DOMWindowOverlay');
-					$DOMWindowOverlay.fadeIn('fast');
-					if(!settings.modal){$DOMWindowOverlay.click(function(){$.closeDOMWindow();});}
-				}
-				
-				//loader
-				if(settings.loader && settings.loaderImagePath !== ''){
-					$('body').append('<div id="DOMWindowLoader" style="z-index:10002;width:'+settings.loaderWidth+'px;height:'+settings.loaderHeight+'px;"><img src="'+settings.loaderImagePath+'" /></div>');
-					centerLoader();
-				}
-
-				//add DOMwindow
-				$('body').append('<div id="DOMWindow" style="background-repeat:no-repeat;'+settings.windowBGImage+';overflow:'+settings.windowOverflow+';padding:'+settings.windowPadding+'px;display:none;height:'+settings.height+'px;width:'+settings.width+'px;background-color:'+settings.windowBGColor+';border:'+settings.borderSize+'px solid '+settings.borderColor+'; position:absolute;z-index:10001"></div>');
-				
-				var $DOMWindow = $('#DOMWindow');
-				//centered, absolute, or fixed
-				switch(settings.positionType){
-					case 'centered':
-						centerDOMWindow();
-						if(settings.height + 50 > shortcut.viewPortHeight()){//added 50 to be safe
-							$DOMWindow.css('top', (settings.fixedWindowY + shortcut.scrollOffsetHeight()) + 'px');
-						}
-					break;
-					case 'absolute':
-						$DOMWindow.css({'top':(settings.positionTop+shortcut.scrollOffsetHeight())+'px','left':(settings.positionLeft+shortcut.scrollOffsetWidth())+'px'});
-						if($.fn.draggable){
-							if(settings.draggable){$DOMWindow.draggable({cursor:'move'});}
-						}
-					break;
-					case 'fixed':
-						fixedDOMWindow();
-					break;
-					case 'anchoredSingleWindow':
-						var anchoredPositions = $(settings.anchoredSelector).position();
-						var anchoredPositionX = anchoredPositions.left + settings.positionLeft;
-						var anchoredPositionY = anchoredPositions.top + settings.positionTop;
-						$DOMWindow.css({'top':anchoredPositionY + 'px','left':anchoredPositionX+'px'});
-								
-					break;
-				}
-				
-				$(window).bind('scroll.DOMWindow',function(){
-					if(settings.overlay){sizeOverlay();}
-					if(shortcut.isIE6){sizeIE6Iframe();}
-					if(settings.positionType == 'centered'){centerDOMWindow();}
-					if(settings.positionType == 'fixed'){fixedDOMWindow();}
-				});
-
-				$(window).bind('resize.DOMWindow',function(){
-					if(shortcut.isIE6){sizeIE6Iframe();}
-					if(settings.overlay){sizeOverlay();}
-					if(settings.positionType == 'centered'){centerDOMWindow();}
-				});
-				
-				switch(settings.windowSource){
-					case 'inline'://////////////////////////////// inline //////////////////////////////////////////
-						$DOMWindow.append($(settings.windowSourceID).children());
-						$DOMWindow.unload(function(){// move elements back when you're finished
-							$(settings.windowSourceID).append($DOMWindow.children());				
-						});
-						showDOMWindow();
-					break;
-					case 'iframe'://////////////////////////////// iframe //////////////////////////////////////////
-						var name = 'DOMWindowIframe'+Math.round(Math.random()*1000);
-						$DOMWindow.append('<iframe frameborder="0" hspace="0" wspace="0" src="'+settings.windowSourceURL+'" name="'+name+'" style="width:100%;height:100%;border:none;background-color:#fff;overflow:'+settings.windowOverflow+';" id="DOMWindowIframe" ></iframe>');
-						$('#DOMWindowIframe').load(showDOMWindow());
-					break;
-					case 'ajax'://////////////////////////////// ajax //////////////////////////////////////////
-						if(settings.windowHTTPType == 'post'){
-							
-							if(settings.windowSourceURL.indexOf("?") !== -1){//has a query string
-								urlOnly = settings.windowSourceURL.substr(0, settings.windowSourceURL.indexOf("?"));
-								urlQueryObject = urlQueryToObject(settings.windowSourceURL, settings.ajaxParameters);
-							}else{
-								urlOnly = settings.windowSourceURL;
-								urlQueryObject = settings.ajaxParameters;
-							}
-							$DOMWindow.load(urlOnly,urlQueryObject,function(){
-								showDOMWindow();
-							});
-						}else{
-							if(settings.windowSourceURL.indexOf("?") == -1){ //no query string, so add one
-								settings.windowSourceURL += '?';
-							}
-							$DOMWindow.load(
-								settings.windowSourceURL + '&random=' + (new Date().getTime()),function(){
-								showDOMWindow();
-							});
-						}
-					break;
-				}
-				
-			}//end if anchored, or absolute, fixed, centered
-			
-		};//end run()
-		
-		if(settings.eventType){//if used with $().
-			return this.each(function(index){				  
-				$(this).bind(settings.eventType,function(){
-					run(this);
-					return false;
-				});
-			});	
-		}else{//else called as $.function
-			run();
-		}
-		
-	};//end function openDOMWindow
-	
-	//allow for public call, pass settings
-	$.openDOMWindow = function(s){$.fn.openDOMWindow(s);};
-	
-})(jQuery);
--- a/web/static/iriuser/js/jquery.js	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/*
- * jQuery JavaScript Library v1.3.2
- * http://jquery.com/
- *
- * Copyright (c) 2009 John Resig
- * Dual licensed under the MIT and GPL licenses.
- * http://docs.jquery.com/License
- *
- * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
- * Revision: 6246
- */
-(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
-/*
- * Sizzle CSS Selector Engine - v0.9.3
- *  Copyright 2009, The Dojo Foundation
- *  Released under the MIT, BSD, and GPL Licenses.
- *  More information: http://sizzlejs.com/
- */
-(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
\ No newline at end of file
--- a/web/static/iriuser/js/jquery.validate.js	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1131 +0,0 @@
-/*
- * jQuery validation plug-in 1.5.5
- *
- * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
- * http://docs.jquery.com/Plugins/Validation
- *
- * Copyright (c) 2006 - 2008 Jörn Zaefferer
- *
- * $Id: jquery.validate.js 6403 2009-06-17 14:27:16Z joern.zaefferer $
- *
- * Dual licensed under the MIT and GPL licenses:
- *   http://www.opensource.org/licenses/mit-license.php
- *   http://www.gnu.org/licenses/gpl.html
- */
-
-(function($) {
-
-$.extend($.fn, {
-	// http://docs.jquery.com/Plugins/Validation/validate
-	validate: function( options ) {
-
-		// if nothing is selected, return nothing; can't chain anyway
-		if (!this.length) {
-			options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
-			return;
-		}
-
-		// check if a validator for this form was already created
-		var validator = $.data(this[0], 'validator');
-		if ( validator ) {
-			return validator;
-		}
-		
-		validator = new $.validator( options, this[0] );
-		$.data(this[0], 'validator', validator); 
-		
-		if ( validator.settings.onsubmit ) {
-		
-			// allow suppresing validation by adding a cancel class to the submit button
-			this.find("input, button").filter(".cancel").click(function() {
-				validator.cancelSubmit = true;
-			});
-			
-			// when a submitHandler is used, capture the submitting button
-			if (validator.settings.submitHandler) {
-				this.find("input, button").filter(":submit").click(function() {
-					validator.submitButton = this;
-				});
-			}
-		
-			// validate the form on submit
-			this.submit( function( event ) {
-				if ( validator.settings.debug )
-					// prevent form submit to be able to see console output
-					event.preventDefault();
-					
-				function handle() {
-					if ( validator.settings.submitHandler ) {
-						if (validator.submitButton) {
-							// insert a hidden input as a replacement for the missing submit button
-							var hidden = $("<input type='hidden'/>").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm);
-						}
-						validator.settings.submitHandler.call( validator, validator.currentForm );
-						if (validator.submitButton) {
-							// and clean up afterwards; thanks to no-block-scope, hidden can be referenced
-							hidden.remove();
-						}
-						return false;
-					}
-					return true;
-				}
-					
-				// prevent submit for invalid forms or custom submit handlers
-				if ( validator.cancelSubmit ) {
-					validator.cancelSubmit = false;
-					return handle();
-				}
-				if ( validator.form() ) {
-					if ( validator.pendingRequest ) {
-						validator.formSubmitted = true;
-						return false;
-					}
-					return handle();
-				} else {
-					validator.focusInvalid();
-					return false;
-				}
-			});
-		}
-		
-		return validator;
-	},
-	// http://docs.jquery.com/Plugins/Validation/valid
-	valid: function() {
-        if ( $(this[0]).is('form')) {
-            return this.validate().form();
-        } else {
-            var valid = true;
-            var validator = $(this[0].form).validate();
-            this.each(function() {
-				valid &= validator.element(this);
-            });
-            return valid;
-        }
-    },
-	// attributes: space seperated list of attributes to retrieve and remove
-	removeAttrs: function(attributes) {
-		var result = {},
-			$element = this;
-		$.each(attributes.split(/\s/), function(index, value) {
-			result[value] = $element.attr(value);
-			$element.removeAttr(value);
-		});
-		return result;
-	},
-	// http://docs.jquery.com/Plugins/Validation/rules
-	rules: function(command, argument) {
-		var element = this[0];
-		
-		if (command) {
-			var settings = $.data(element.form, 'validator').settings;
-			var staticRules = settings.rules;
-			var existingRules = $.validator.staticRules(element);
-			switch(command) {
-			case "add":
-				$.extend(existingRules, $.validator.normalizeRule(argument));
-				staticRules[element.name] = existingRules;
-				if (argument.messages)
-					settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );
-				break;
-			case "remove":
-				if (!argument) {
-					delete staticRules[element.name];
-					return existingRules;
-				}
-				var filtered = {};
-				$.each(argument.split(/\s/), function(index, method) {
-					filtered[method] = existingRules[method];
-					delete existingRules[method];
-				});
-				return filtered;
-			}
-		}
-		
-		var data = $.validator.normalizeRules(
-		$.extend(
-			{},
-			$.validator.metadataRules(element),
-			$.validator.classRules(element),
-			$.validator.attributeRules(element),
-			$.validator.staticRules(element)
-		), element);
-		
-		// make sure required is at front
-		if (data.required) {
-			var param = data.required;
-			delete data.required;
-			data = $.extend({required: param}, data);
-		}
-		
-		return data;
-	}
-});
-
-// Custom selectors
-$.extend($.expr[":"], {
-	// http://docs.jquery.com/Plugins/Validation/blank
-	blank: function(a) {return !$.trim(a.value);},
-	// http://docs.jquery.com/Plugins/Validation/filled
-	filled: function(a) {return !!$.trim(a.value);},
-	// http://docs.jquery.com/Plugins/Validation/unchecked
-	unchecked: function(a) {return !a.checked;}
-});
-
-// constructor for validator
-$.validator = function( options, form ) {
-	this.settings = $.extend( {}, $.validator.defaults, options );
-	this.currentForm = form;
-	this.init();
-};
-
-$.validator.format = function(source, params) {
-	if ( arguments.length == 1 ) 
-		return function() {
-			var args = $.makeArray(arguments);
-			args.unshift(source);
-			return $.validator.format.apply( this, args );
-		};
-	if ( arguments.length > 2 && params.constructor != Array  ) {
-		params = $.makeArray(arguments).slice(1);
-	}
-	if ( params.constructor != Array ) {
-		params = [ params ];
-	}
-	$.each(params, function(i, n) {
-		source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
-	});
-	return source;
-};
-
-$.extend($.validator, {
-	
-	defaults: {
-		messages: {},
-		groups: {},
-		rules: {},
-		errorClass: "error",
-		validClass: "valid",
-		errorElement: "label",
-		focusInvalid: true,
-		errorContainer: $( [] ),
-		errorLabelContainer: $( [] ),
-		onsubmit: true,
-		ignore: [],
-		ignoreTitle: false,
-		onfocusin: function(element) {
-			this.lastActive = element;
-				
-			// hide error label and remove error class on focus if enabled
-			if ( this.settings.focusCleanup && !this.blockFocusCleanup ) {
-				this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
-				this.errorsFor(element).hide();
-			}
-		},
-		onfocusout: function(element) {
-			if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
-				this.element(element);
-			}
-		},
-		onkeyup: function(element) {
-			if ( element.name in this.submitted || element == this.lastElement ) {
-				this.element(element);
-			}
-		},
-		onclick: function(element) {
-			if ( element.name in this.submitted )
-				this.element(element);
-		},
-		highlight: function( element, errorClass, validClass ) {
-			$(element).addClass(errorClass).removeClass(validClass);
-		},
-		unhighlight: function( element, errorClass, validClass ) {
-			$(element).removeClass(errorClass).addClass(validClass);
-		}
-	},
-
-	// http://docs.jquery.com/Plugins/Validation/Validator/setDefaults
-	setDefaults: function(settings) {
-		$.extend( $.validator.defaults, settings );
-	},
-
-	messages: {
-		required: "This field is required.",
-		remote: "Please fix this field.",
-		email: "Please enter a valid email address.",
-		url: "Please enter a valid URL.",
-		date: "Please enter a valid date.",
-		dateISO: "Please enter a valid date (ISO).",
-		dateDE: "Bitte geben Sie ein gültiges Datum ein.",
-		number: "Please enter a valid number.",
-		numberDE: "Bitte geben Sie eine Nummer ein.",
-		digits: "Please enter only digits",
-		creditcard: "Please enter a valid credit card number.",
-		equalTo: "Please enter the same value again.",
-		accept: "Please enter a value with a valid extension.",
-		maxlength: $.validator.format("Please enter no more than {0} characters."),
-		minlength: $.validator.format("Please enter at least {0} characters."),
-		rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
-		range: $.validator.format("Please enter a value between {0} and {1}."),
-		max: $.validator.format("Please enter a value less than or equal to {0}."),
-		min: $.validator.format("Please enter a value greater than or equal to {0}.")
-	},
-	
-	autoCreateRanges: false,
-	
-	prototype: {
-		
-		init: function() {
-			this.labelContainer = $(this.settings.errorLabelContainer);
-			this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
-			this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );
-			this.submitted = {};
-			this.valueCache = {};
-			this.pendingRequest = 0;
-			this.pending = {};
-			this.invalid = {};
-			this.reset();
-			
-			var groups = (this.groups = {});
-			$.each(this.settings.groups, function(key, value) {
-				$.each(value.split(/\s/), function(index, name) {
-					groups[name] = key;
-				});
-			});
-			var rules = this.settings.rules;
-			$.each(rules, function(key, value) {
-				rules[key] = $.validator.normalizeRule(value);
-			});
-			
-			function delegate(event) {
-				var validator = $.data(this[0].form, "validator");
-				validator.settings["on" + event.type] && validator.settings["on" + event.type].call(validator, this[0] );
-			}
-			$(this.currentForm)
-				.delegate("focusin focusout keyup", ":text, :password, :file, select, textarea", delegate)
-				.delegate("click", ":radio, :checkbox", delegate);
-
-			if (this.settings.invalidHandler)
-				$(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
-		},
-
-		// http://docs.jquery.com/Plugins/Validation/Validator/form
-		form: function() {
-			this.checkForm();
-			$.extend(this.submitted, this.errorMap);
-			this.invalid = $.extend({}, this.errorMap);
-			if (!this.valid())
-				$(this.currentForm).triggerHandler("invalid-form", [this]);
-			this.showErrors();
-			return this.valid();
-		},
-		
-		checkForm: function() {
-			this.prepareForm();
-			for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {
-				this.check( elements[i] );
-			}
-			return this.valid(); 
-		},
-		
-		// http://docs.jquery.com/Plugins/Validation/Validator/element
-		element: function( element ) {
-			element = this.clean( element );
-			this.lastElement = element;
-			this.prepareElement( element );
-			this.currentElements = $(element);
-			var result = this.check( element );
-			if ( result ) {
-				delete this.invalid[element.name];
-			} else {
-				this.invalid[element.name] = true;
-			}
-			if ( !this.numberOfInvalids() ) {
-				// Hide error containers on last error
-				this.toHide = this.toHide.add( this.containers );
-			}
-			this.showErrors();
-			return result;
-		},
-
-		// http://docs.jquery.com/Plugins/Validation/Validator/showErrors
-		showErrors: function(errors) {
-			if(errors) {
-				// add items to error list and map
-				$.extend( this.errorMap, errors );
-				this.errorList = [];
-				for ( var name in errors ) {
-					this.errorList.push({
-						message: errors[name],
-						element: this.findByName(name)[0]
-					});
-				}
-				// remove items from success list
-				this.successList = $.grep( this.successList, function(element) {
-					return !(element.name in errors);
-				});
-			}
-			this.settings.showErrors
-				? this.settings.showErrors.call( this, this.errorMap, this.errorList )
-				: this.defaultShowErrors();
-		},
-		
-		// http://docs.jquery.com/Plugins/Validation/Validator/resetForm
-		resetForm: function() {
-			if ( $.fn.resetForm )
-				$( this.currentForm ).resetForm();
-			this.submitted = {};
-			this.prepareForm();
-			this.hideErrors();
-			this.elements().removeClass( this.settings.errorClass );
-		},
-		
-		numberOfInvalids: function() {
-			return this.objectLength(this.invalid);
-		},
-		
-		objectLength: function( obj ) {
-			var count = 0;
-			for ( var i in obj )
-				count++;
-			return count;
-		},
-		
-		hideErrors: function() {
-			this.addWrapper( this.toHide ).hide();
-		},
-		
-		valid: function() {
-			return this.size() == 0;
-		},
-		
-		size: function() {
-			return this.errorList.length;
-		},
-		
-		focusInvalid: function() {
-			if( this.settings.focusInvalid ) {
-				try {
-					$(this.findLastActive() || this.errorList.length && this.errorList[0].element || []).filter(":visible").focus();
-				} catch(e) {
-					// ignore IE throwing errors when focusing hidden elements
-				}
-			}
-		},
-		
-		findLastActive: function() {
-			var lastActive = this.lastActive;
-			return lastActive && $.grep(this.errorList, function(n) {
-				return n.element.name == lastActive.name;
-			}).length == 1 && lastActive;
-		},
-		
-		elements: function() {
-			var validator = this,
-				rulesCache = {};
-			
-			// select all valid inputs inside the form (no submit or reset buttons)
-			// workaround $Query([]).add until http://dev.jquery.com/ticket/2114 is solved
-			return $([]).add(this.currentForm.elements)
-			.filter(":input")
-			.not(":submit, :reset, :image, [disabled]")
-			.not( this.settings.ignore )
-			.filter(function() {
-				!this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this);
-			
-				// select only the first element for each name, and only those with rules specified
-				if ( this.name in rulesCache || !validator.objectLength($(this).rules()) )
-					return false;
-				
-				rulesCache[this.name] = true;
-				return true;
-			});
-		},
-		
-		clean: function( selector ) {
-			return $( selector )[0];
-		},
-		
-		errors: function() {
-			return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext );
-		},
-		
-		reset: function() {
-			this.successList = [];
-			this.errorList = [];
-			this.errorMap = {};
-			this.toShow = $([]);
-			this.toHide = $([]);
-			this.formSubmitted = false;
-			this.currentElements = $([]);
-		},
-		
-		prepareForm: function() {
-			this.reset();
-			this.toHide = this.errors().add( this.containers );
-		},
-		
-		prepareElement: function( element ) {
-			this.reset();
-			this.toHide = this.errorsFor(element);
-		},
-	
-		check: function( element ) {
-			element = this.clean( element );
-			
-			// if radio/checkbox, validate first element in group instead
-			if (this.checkable(element)) {
-				element = this.findByName( element.name )[0];
-			}
-			
-			var rules = $(element).rules();
-			var dependencyMismatch = false;
-			for( method in rules ) {
-				var rule = { method: method, parameters: rules[method] };
-				try {
-					var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters );
-					
-					// if a method indicates that the field is optional and therefore valid,
-					// don't mark it as valid when there are no other rules
-					if ( result == "dependency-mismatch" ) {
-						dependencyMismatch = true;
-						continue;
-					}
-					dependencyMismatch = false;
-					
-					if ( result == "pending" ) {
-						this.toHide = this.toHide.not( this.errorsFor(element) );
-						return;
-					}
-					
-					if( !result ) {
-						this.formatAndAdd( element, rule );
-						return false;
-					}
-				} catch(e) {
-					this.settings.debug && window.console && console.log("exception occured when checking element " + element.id
-						 + ", check the '" + rule.method + "' method");
-					throw e;
-				}
-			}
-			if (dependencyMismatch)
-				return;
-			if ( this.objectLength(rules) )
-				this.successList.push(element);
-			return true;
-		},
-		
-		// return the custom message for the given element and validation method
-		// specified in the element's "messages" metadata
-		customMetaMessage: function(element, method) {
-			if (!$.metadata)
-				return;
-			
-			var meta = this.settings.meta
-				? $(element).metadata()[this.settings.meta]
-				: $(element).metadata();
-			
-			return meta && meta.messages && meta.messages[method];
-		},
-		
-		// return the custom message for the given element name and validation method
-		customMessage: function( name, method ) {
-			var m = this.settings.messages[name];
-			return m && (m.constructor == String
-				? m
-				: m[method]);
-		},
-		
-		// return the first defined argument, allowing empty strings
-		findDefined: function() {
-			for(var i = 0; i < arguments.length; i++) {
-				if (arguments[i] !== undefined)
-					return arguments[i];
-			}
-			return undefined;
-		},
-		
-		defaultMessage: function( element, method) {
-			return this.findDefined(
-				this.customMessage( element.name, method ),
-				this.customMetaMessage( element, method ),
-				// title is never undefined, so handle empty string as undefined
-				!this.settings.ignoreTitle && element.title || undefined,
-				$.validator.messages[method],
-				"<strong>Warning: No message defined for " + element.name + "</strong>"
-			);
-		},
-		
-		formatAndAdd: function( element, rule ) {
-			var message = this.defaultMessage( element, rule.method );
-			if ( typeof message == "function" ) 
-				message = message.call(this, rule.parameters, element);
-			this.errorList.push({
-				message: message,
-				element: element
-			});
-			this.errorMap[element.name] = message;
-			this.submitted[element.name] = message;
-		},
-		
-		addWrapper: function(toToggle) {
-			if ( this.settings.wrapper )
-				toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
-			return toToggle;
-		},
-		
-		defaultShowErrors: function() {
-			for ( var i = 0; this.errorList[i]; i++ ) {
-				var error = this.errorList[i];
-				this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
-				this.showLabel( error.element, error.message );
-			}
-			if( this.errorList.length ) {
-				this.toShow = this.toShow.add( this.containers );
-			}
-			if (this.settings.success) {
-				for ( var i = 0; this.successList[i]; i++ ) {
-					this.showLabel( this.successList[i] );
-				}
-			}
-			if (this.settings.unhighlight) {
-				for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {
-					this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass );
-				}
-			}
-			this.toHide = this.toHide.not( this.toShow );
-			this.hideErrors();
-			this.addWrapper( this.toShow ).show();
-		},
-		
-		validElements: function() {
-			return this.currentElements.not(this.invalidElements());
-		},
-		
-		invalidElements: function() {
-			return $(this.errorList).map(function() {
-				return this.element;
-			});
-		},
-		
-		showLabel: function(element, message) {
-			var label = this.errorsFor( element );
-			if ( label.length ) {
-				// refresh error/success class
-				label.removeClass().addClass( this.settings.errorClass );
-			
-				// check if we have a generated label, replace the message then
-				label.attr("generated") && label.html(message);
-			} else {
-				// create label
-				label = $("<" + this.settings.errorElement + "/>")
-					.attr({"for":  this.idOrName(element), generated: true})
-					.addClass(this.settings.errorClass)
-					.html(message || "");
-				if ( this.settings.wrapper ) {
-					// make sure the element is visible, even in IE
-					// actually showing the wrapped element is handled elsewhere
-					label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
-				}
-				if ( !this.labelContainer.append(label).length )
-					this.settings.errorPlacement
-						? this.settings.errorPlacement(label, $(element) )
-						: label.insertAfter(element);
-			}
-			if ( !message && this.settings.success ) {
-				label.text("");
-				typeof this.settings.success == "string"
-					? label.addClass( this.settings.success )
-					: this.settings.success( label );
-			}
-			this.toShow = this.toShow.add(label);
-		},
-		
-		errorsFor: function(element) {
-			return this.errors().filter("[for='" + this.idOrName(element) + "']");
-		},
-		
-		idOrName: function(element) {
-			return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);
-		},
-
-		checkable: function( element ) {
-			return /radio|checkbox/i.test(element.type);
-		},
-		
-		findByName: function( name ) {
-			// select by name and filter by form for performance over form.find("[name=...]")
-			var form = this.currentForm;
-			return $(document.getElementsByName(name)).map(function(index, element) {
-				return element.form == form && element.name == name && element  || null;
-			});
-		},
-		
-		getLength: function(value, element) {
-			switch( element.nodeName.toLowerCase() ) {
-			case 'select':
-				return $("option:selected", element).length;
-			case 'input':
-				if( this.checkable( element) )
-					return this.findByName(element.name).filter(':checked').length;
-			}
-			return value.length;
-		},
-	
-		depend: function(param, element) {
-			return this.dependTypes[typeof param]
-				? this.dependTypes[typeof param](param, element)
-				: true;
-		},
-	
-		dependTypes: {
-			"boolean": function(param, element) {
-				return param;
-			},
-			"string": function(param, element) {
-				return !!$(param, element.form).length;
-			},
-			"function": function(param, element) {
-				return param(element);
-			}
-		},
-		
-		optional: function(element) {
-			return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch";
-		},
-		
-		startRequest: function(element) {
-			if (!this.pending[element.name]) {
-				this.pendingRequest++;
-				this.pending[element.name] = true;
-			}
-		},
-		
-		stopRequest: function(element, valid) {
-			this.pendingRequest--;
-			// sometimes synchronization fails, make sure pendingRequest is never < 0
-			if (this.pendingRequest < 0)
-				this.pendingRequest = 0;
-			delete this.pending[element.name];
-			if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) {
-				$(this.currentForm).submit();
-			} else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {
-				$(this.currentForm).triggerHandler("invalid-form", [this]);
-			}
-		},
-		
-		previousValue: function(element) {
-			return $.data(element, "previousValue") || $.data(element, "previousValue", previous = {
-				old: null,
-				valid: true,
-				message: this.defaultMessage( element, "remote" )
-			});
-		}
-		
-	},
-	
-	classRuleSettings: {
-		required: {required: true},
-		email: {email: true},
-		url: {url: true},
-		date: {date: true},
-		dateISO: {dateISO: true},
-		dateDE: {dateDE: true},
-		number: {number: true},
-		numberDE: {numberDE: true},
-		digits: {digits: true},
-		creditcard: {creditcard: true}
-	},
-	
-	addClassRules: function(className, rules) {
-		className.constructor == String ?
-			this.classRuleSettings[className] = rules :
-			$.extend(this.classRuleSettings, className);
-	},
-	
-	classRules: function(element) {
-		var rules = {};
-		var classes = $(element).attr('class');
-		classes && $.each(classes.split(' '), function() {
-			if (this in $.validator.classRuleSettings) {
-				$.extend(rules, $.validator.classRuleSettings[this]);
-			}
-		});
-		return rules;
-	},
-	
-	attributeRules: function(element) {
-		var rules = {};
-		var $element = $(element);
-		
-		for (method in $.validator.methods) {
-			var value = $element.attr(method);
-			if (value) {
-				rules[method] = value;
-			}
-		}
-		
-		// maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs
-		if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {
-			delete rules.maxlength;
-		}
-		
-		return rules;
-	},
-	
-	metadataRules: function(element) {
-		if (!$.metadata) return {};
-		
-		var meta = $.data(element.form, 'validator').settings.meta;
-		return meta ?
-			$(element).metadata()[meta] :
-			$(element).metadata();
-	},
-	
-	staticRules: function(element) {
-		var rules = {};
-		var validator = $.data(element.form, 'validator');
-		if (validator.settings.rules) {
-			rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};
-		}
-		return rules;
-	},
-	
-	normalizeRules: function(rules, element) {
-		// handle dependency check
-		$.each(rules, function(prop, val) {
-			// ignore rule when param is explicitly false, eg. required:false
-			if (val === false) {
-				delete rules[prop];
-				return;
-			}
-			if (val.param || val.depends) {
-				var keepRule = true;
-				switch (typeof val.depends) {
-					case "string":
-						keepRule = !!$(val.depends, element.form).length;
-						break;
-					case "function":
-						keepRule = val.depends.call(element, element);
-						break;
-				}
-				if (keepRule) {
-					rules[prop] = val.param !== undefined ? val.param : true;
-				} else {
-					delete rules[prop];
-				}
-			}
-		});
-		
-		// evaluate parameters
-		$.each(rules, function(rule, parameter) {
-			rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;
-		});
-		
-		// clean number parameters
-		$.each(['minlength', 'maxlength', 'min', 'max'], function() {
-			if (rules[this]) {
-				rules[this] = Number(rules[this]);
-			}
-		});
-		$.each(['rangelength', 'range'], function() {
-			if (rules[this]) {
-				rules[this] = [Number(rules[this][0]), Number(rules[this][1])];
-			}
-		});
-		
-		if ($.validator.autoCreateRanges) {
-			// auto-create ranges
-			if (rules.min && rules.max) {
-				rules.range = [rules.min, rules.max];
-				delete rules.min;
-				delete rules.max;
-			}
-			if (rules.minlength && rules.maxlength) {
-				rules.rangelength = [rules.minlength, rules.maxlength];
-				delete rules.minlength;
-				delete rules.maxlength;
-			}
-		}
-		
-		// To support custom messages in metadata ignore rule methods titled "messages"
-		if (rules.messages) {
-			delete rules.messages
-		}
-		
-		return rules;
-	},
-	
-	// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
-	normalizeRule: function(data) {
-		if( typeof data == "string" ) {
-			var transformed = {};
-			$.each(data.split(/\s/), function() {
-				transformed[this] = true;
-			});
-			data = transformed;
-		}
-		return data;
-	},
-	
-	// http://docs.jquery.com/Plugins/Validation/Validator/addMethod
-	addMethod: function(name, method, message) {
-		$.validator.methods[name] = method;
-		$.validator.messages[name] = message || $.validator.messages[name];
-		if (method.length < 3) {
-			$.validator.addClassRules(name, $.validator.normalizeRule(name));
-		}
-	},
-
-	methods: {
-
-		// http://docs.jquery.com/Plugins/Validation/Methods/required
-		required: function(value, element, param) {
-			// check if dependency is met
-			if ( !this.depend(param, element) )
-				return "dependency-mismatch";
-			switch( element.nodeName.toLowerCase() ) {
-			case 'select':
-				var options = $("option:selected", element);
-				return options.length > 0 && ( element.type == "select-multiple" || ($.browser.msie && !(options[0].attributes['value'].specified) ? options[0].text : options[0].value).length > 0);
-			case 'input':
-				if ( this.checkable(element) )
-					return this.getLength(value, element) > 0;
-			default:
-				return $.trim(value).length > 0;
-			}
-		},
-		
-		// http://docs.jquery.com/Plugins/Validation/Methods/remote
-		remote: function(value, element, param) {
-			if ( this.optional(element) )
-				return "dependency-mismatch";
-			
-			var previous = this.previousValue(element);
-			
-			if (!this.settings.messages[element.name] )
-				this.settings.messages[element.name] = {};
-			this.settings.messages[element.name].remote = typeof previous.message == "function" ? previous.message(value) : previous.message;
-			
-			param = typeof param == "string" && {url:param} || param; 
-			
-			if ( previous.old !== value ) {
-				previous.old = value;
-				var validator = this;
-				this.startRequest(element);
-				var data = {};
-				data[element.name] = value;
-				$.ajax($.extend(true, {
-					url: param,
-					mode: "abort",
-					port: "validate" + element.name,
-					dataType: "json",
-					data: data,
-					success: function(response) {
-						var valid = response === true;
-						if ( valid ) {
-							var submitted = validator.formSubmitted;
-							validator.prepareElement(element);
-							validator.formSubmitted = submitted;
-							validator.successList.push(element);
-							validator.showErrors();
-						} else {
-							var errors = {};
-							errors[element.name] = previous.message = response || validator.defaultMessage( element, "remote" );
-							validator.showErrors(errors);
-						}
-						previous.valid = valid;
-						validator.stopRequest(element, valid);
-					}
-				}, param));
-				return "pending";
-			} else if( this.pending[element.name] ) {
-				return "pending";
-			}
-			return previous.valid;
-		},
-
-		// http://docs.jquery.com/Plugins/Validation/Methods/minlength
-		minlength: function(value, element, param) {
-			return this.optional(element) || this.getLength($.trim(value), element) >= param;
-		},
-		
-		// http://docs.jquery.com/Plugins/Validation/Methods/maxlength
-		maxlength: function(value, element, param) {
-			return this.optional(element) || this.getLength($.trim(value), element) <= param;
-		},
-		
-		// http://docs.jquery.com/Plugins/Validation/Methods/rangelength
-		rangelength: function(value, element, param) {
-			var length = this.getLength($.trim(value), element);
-			return this.optional(element) || ( length >= param[0] && length <= param[1] );
-		},
-		
-		// http://docs.jquery.com/Plugins/Validation/Methods/min
-		min: function( value, element, param ) {
-			return this.optional(element) || value >= param;
-		},
-		
-		// http://docs.jquery.com/Plugins/Validation/Methods/max
-		max: function( value, element, param ) {
-			return this.optional(element) || value <= param;
-		},
-		
-		// http://docs.jquery.com/Plugins/Validation/Methods/range
-		range: function( value, element, param ) {
-			return this.optional(element) || ( value >= param[0] && value <= param[1] );
-		},
-		
-		// http://docs.jquery.com/Plugins/Validation/Methods/email
-		email: function(value, element) {
-			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
-			return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
-		},
-	
-		// http://docs.jquery.com/Plugins/Validation/Methods/url
-		url: function(value, element) {
-			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
-			return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
-		},
-        
-		// http://docs.jquery.com/Plugins/Validation/Methods/date
-		date: function(value, element) {
-			return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
-		},
-	
-		// http://docs.jquery.com/Plugins/Validation/Methods/dateISO
-		dateISO: function(value, element) {
-			return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);
-		},
-	
-		// http://docs.jquery.com/Plugins/Validation/Methods/dateDE
-		dateDE: function(value, element) {
-			return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value);
-		},
-	
-		// http://docs.jquery.com/Plugins/Validation/Methods/number
-		number: function(value, element) {
-			return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
-		},
-	
-		// http://docs.jquery.com/Plugins/Validation/Methods/numberDE
-		numberDE: function(value, element) {
-			return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
-		},
-		
-		// http://docs.jquery.com/Plugins/Validation/Methods/digits
-		digits: function(value, element) {
-			return this.optional(element) || /^\d+$/.test(value);
-		},
-		
-		// http://docs.jquery.com/Plugins/Validation/Methods/creditcard
-		// based on http://en.wikipedia.org/wiki/Luhn
-		creditcard: function(value, element) {
-			if ( this.optional(element) )
-				return "dependency-mismatch";
-			// accept only digits and dashes
-			if (/[^0-9-]+/.test(value))
-				return false;
-			var nCheck = 0,
-				nDigit = 0,
-				bEven = false;
-
-			value = value.replace(/\D/g, "");
-
-			for (n = value.length - 1; n >= 0; n--) {
-				var cDigit = value.charAt(n);
-				var nDigit = parseInt(cDigit, 10);
-				if (bEven) {
-					if ((nDigit *= 2) > 9)
-						nDigit -= 9;
-				}
-				nCheck += nDigit;
-				bEven = !bEven;
-			}
-
-			return (nCheck % 10) == 0;
-		},
-		
-		// http://docs.jquery.com/Plugins/Validation/Methods/accept
-		accept: function(value, element, param) {
-			param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif";
-			return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); 
-		},
-		
-		// http://docs.jquery.com/Plugins/Validation/Methods/equalTo
-		equalTo: function(value, element, param) {
-			return value == $(param).val();
-		}
-		
-	}
-	
-});
-
-// deprecated, use $.validator.format instead
-$.format = $.validator.format;
-
-})(jQuery);
-
-// ajax mode: abort
-// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
-// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() 
-;(function($) {
-	var ajax = $.ajax;
-	var pendingRequests = {};
-	$.ajax = function(settings) {
-		// create settings for compatibility with ajaxSetup
-		settings = $.extend(settings, $.extend({}, $.ajaxSettings, settings));
-		var port = settings.port;
-		if (settings.mode == "abort") {
-			if ( pendingRequests[port] ) {
-				pendingRequests[port].abort();
-			}
-			return (pendingRequests[port] = ajax.apply(this, arguments));
-		}
-		return ajax.apply(this, arguments);
-	};
-})(jQuery);
-
-// provides cross-browser focusin and focusout events
-// IE has native support, in other browsers, use event caputuring (neither bubbles)
-
-// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
-// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target 
-
-// provides triggerEvent(type: String, target: Element) to trigger delegated events
-;(function($) {
-	$.each({
-		focus: 'focusin',
-		blur: 'focusout'	
-	}, function( original, fix ){
-		$.event.special[fix] = {
-			setup:function() {
-				if ( $.browser.msie ) return false;
-				this.addEventListener( original, $.event.special[fix].handler, true );
-			},
-			teardown:function() {
-				if ( $.browser.msie ) return false;
-				this.removeEventListener( original,
-				$.event.special[fix].handler, true );
-			},
-			handler: function(e) {
-				arguments[0] = $.event.fix(e);
-				arguments[0].type = fix;
-				return $.event.handle.apply(this, arguments);
-			}
-		};
-	});
-	$.extend($.fn, {
-		delegate: function(type, delegate, handler) {
-			return this.bind(type, function(event) {
-				var target = $(event.target);
-				if (target.is(delegate)) {
-					return handler.apply(target, arguments);
-				}
-			});
-		},
-		triggerEvent: function(type, target) {
-			return this.triggerHandler(type, [$.event.fix({ type: type, target: target })]);
-		}
-	})
-})(jQuery);
--- a/web/static/iriuser/js/login_ajax/jquery.login.js	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-$(document).ready(function() {
-     $('#password').keypress(function(e) {
-            if(e.which == 13) {
-                jQuery('#submit').focus().click();
-            }
-        });
-
-
-    $("#submit").click(function() {
-        var username=$("#username").val();
-        var password=$("#password").val();
-        var data = {'username': username, 'password': password, 'reload': reload};
-        if(username=="" && password=="")
-        {
-            $("#login_form_username_error").show();
-            $("#login_form_password_error").show();
-            $("#username").addClass("ajaxform_invalid");
-            $("#password").addClass("ajaxform_invalid");
-        }
-        else if(username=="" && password!="")
-        {
-            $("#login_form_username_error").show();
-            $("#username").addClass("ajaxform_invalid");
-        }
-        else if(password=="" && username!="")
-        {
-            $("#login_form_password_error").show();
-            $("#password").addClass("ajaxform_invalid");
-        }
-        else{
-    
-        $.ajax({
-        type: "POST",  
-        url : url_login_ajax,
-        dataType:'json',
-        data: data,
-        error: function (){
-            $("#msg").html("fail to connect");
-            },
-        success: function(data, reload){ //if success, refrash un bout de page pour afficher le nom de utilisateur et déconnecter.
-                            if (data.message!="successful")
-                            {
-                                $("#msg").html(data.message).show();
-                            }
-                            else{
-                            // $("#floatdialog_mask_loginform").hide();
-                            //window.location.reload();
-                                if (data.reload=='true'){
-                                    window.location.reload();
-                                }
-                                else{
-                                    //$("#loginstate").html('<a href ="'+url_userspace+'">'+data.username+'</a> | <a href="'+url_logout+'">déconnection</a>');
-                                    //$("#loginstate").html('<ul class="usertool"><li id="user">'+data.username+'</li><li><a href ="'+url_userprofile+'">Profiles</a></li><li><a href ="'+url_userspace+'">Space</a></li><li><a href="'+url_logout+'">déconnection</a></li></ul>');
-                                    var $DOMWindowOverlay = $('#DOMWindowOverlay');
-                                    var $DOMWindow = $('#DOMWindow');
-                                    $DOMWindowOverlay.fadeOut('fast',function(){
-                                        $DOMWindowOverlay.trigger('unload').unbind().remove();																	  
-                                    });
-                                    $DOMWindow.fadeOut('fast',function(){
-                                        if($.fn.draggable){
-                                            $DOMWindow.draggable("destroy").trigger("unload").remove();
-                                        }else{
-                                            $DOMWindow.trigger("unload").remove();
-                                        }
-                                    });
-                                    $("#loginstate").html(data.html);
-                                }
-                            }
-                         
-                           
-                }  
-        });
-        }
-    });
-})
-
-
--- a/web/static/iriuser/js/login_ajax/login_ajax.css	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-#loginform
-{
-    font-size: 16px;
-    background: #ffffff scroll repeat 0 0;
-    /*border: 2px solid #666666;*/
-    text-align: left;
-    /*width: 400px;*/
-}
-
-#loginform .title
-{
-    color: #FFFFFF;
-    background: #990000 scroll repeat left top;
-    font-weight:bold;
-    height:34px;
-    position: relative;
-    line-height: 34px;
-    overflow: hidden;
-    text-transform: uppercase;
-}
-
-#loginform .title div
-{
-    font-size: 16px;
-    margin-left:12px;
-}
-
-#loginform .title .closeDOMWindow
-{
-    float: right;
-    text-decoration: none;
-    color:#ffffff;
-    padding-right:2px;
-}
-
-#loginform .ajaxform_invalid{
-    background: #ffdddd none repeat scroll 0 0;
-}
-
-#loginform .ajaxform_error{
-    display: none;
-    color:red;
-    font-size: 11px;
-    line-height: 13px;
-}
-
-#loginform #msg{
-    display:none;
-    background:#FBE3E4 none repeat scroll 0 0;
-    color: red;
-    padding:0.5em;
-    border-color:#FBC2C4;
-    font-size: 13px;
-    font-weight:bold;
-}
-
-#loginform dl {
-    font-size:13px;
-    line-height:22px;
-}
-
-#loginform dl dt{
-    clear:left;
-    color:#666666;
-    float:left;
-    font-weight:bold;
-    width:100px
-}
-
-#loginform dl dd {
-    margin-left: 110px;
-    padding-bottom: 8px;
-}
-
-
--- a/web/static/iriuser/js/swfobject.js	Thu Jun 10 19:15:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-/* SWFObject v2.1 <http://code.google.com/p/swfobject/>
-	Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis
-	This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
-*/
-var swfobject=function(){var b="undefined",Q="object",n="Shockwave Flash",p="ShockwaveFlash.ShockwaveFlash",P="application/x-shockwave-flash",m="SWFObjectExprInst",j=window,K=document,T=navigator,o=[],N=[],i=[],d=[],J,Z=null,M=null,l=null,e=false,A=false;var h=function(){var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,AC=[0,0,0],x=null;if(typeof T.plugins!=b&&typeof T.plugins[n]==Q){x=T.plugins[n].description;if(x&&!(typeof T.mimeTypes!=b&&T.mimeTypes[P]&&!T.mimeTypes[P].enabledPlugin)){x=x.replace(/^.*\s+(\S+\s+\S+$)/,"$1");AC[0]=parseInt(x.replace(/^(.*)\..*$/,"$1"),10);AC[1]=parseInt(x.replace(/^.*\.(.*)\s.*$/,"$1"),10);AC[2]=/r/.test(x)?parseInt(x.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof j.ActiveXObject!=b){var y=null,AB=false;try{y=new ActiveXObject(p+".7")}catch(t){try{y=new ActiveXObject(p+".6");AC=[6,0,21];y.AllowScriptAccess="always"}catch(t){if(AC[0]==6){AB=true}}if(!AB){try{y=new ActiveXObject(p)}catch(t){}}}if(!AB&&y){try{x=y.GetVariable("$version");if(x){x=x.split(" ")[1].split(",");AC=[parseInt(x[0],10),parseInt(x[1],10),parseInt(x[2],10)]}}catch(t){}}}}var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,q=false,z=r?/win/.test(r):/win/.test(AD),w=r?/mac/.test(r):/mac/.test(AD);/*@cc_on q=true;@if(@_win32)z=true;@elif(@_mac)w=true;@end@*/return{w3cdom:v,pv:AC,webkit:AA,ie:q,win:z,mac:w}}();var L=function(){if(!h.w3cdom){return }f(H);if(h.ie&&h.win){try{K.write("<script id=__ie_ondomload defer=true src=//:><\/script>");J=C("__ie_ondomload");if(J){I(J,"onreadystatechange",S)}}catch(q){}}if(h.webkit&&typeof K.readyState!=b){Z=setInterval(function(){if(/loaded|complete/.test(K.readyState)){E()}},10)}if(typeof K.addEventListener!=b){K.addEventListener("DOMContentLoaded",E,null)}R(E)}();function S(){if(J.readyState=="complete"){J.parentNode.removeChild(J);E()}}function E(){if(e){return }if(h.ie&&h.win){var v=a("span");try{var u=K.getElementsByTagName("body")[0].appendChild(v);u.parentNode.removeChild(u)}catch(w){return }}e=true;if(Z){clearInterval(Z);Z=null}var q=o.length;for(var r=0;r<q;r++){o[r]()}}function f(q){if(e){q()}else{o[o.length]=q}}function R(r){if(typeof j.addEventListener!=b){j.addEventListener("load",r,false)}else{if(typeof K.addEventListener!=b){K.addEventListener("load",r,false)}else{if(typeof j.attachEvent!=b){I(j,"onload",r)}else{if(typeof j.onload=="function"){var q=j.onload;j.onload=function(){q();r()}}else{j.onload=r}}}}}function H(){var t=N.length;for(var q=0;q<t;q++){var u=N[q].id;if(h.pv[0]>0){var r=C(u);if(r){N[q].width=r.getAttribute("width")?r.getAttribute("width"):"0";N[q].height=r.getAttribute("height")?r.getAttribute("height"):"0";if(c(N[q].swfVersion)){if(h.webkit&&h.webkit<312){Y(r)}W(u,true)}else{if(N[q].expressInstall&&!A&&c("6.0.65")&&(h.win||h.mac)){k(N[q])}else{O(r)}}}}else{W(u,true)}}}function Y(t){var q=t.getElementsByTagName(Q)[0];if(q){var w=a("embed"),y=q.attributes;if(y){var v=y.length;for(var u=0;u<v;u++){if(y[u].nodeName=="DATA"){w.setAttribute("src",y[u].nodeValue)}else{w.setAttribute(y[u].nodeName,y[u].nodeValue)}}}var x=q.childNodes;if(x){var z=x.length;for(var r=0;r<z;r++){if(x[r].nodeType==1&&x[r].nodeName=="PARAM"){w.setAttribute(x[r].getAttribute("name"),x[r].getAttribute("value"))}}}t.parentNode.replaceChild(w,t)}}function k(w){A=true;var u=C(w.id);if(u){if(w.altContentId){var y=C(w.altContentId);if(y){M=y;l=w.altContentId}}else{M=G(u)}if(!(/%$/.test(w.width))&&parseInt(w.width,10)<310){w.width="310"}if(!(/%$/.test(w.height))&&parseInt(w.height,10)<137){w.height="137"}K.title=K.title.slice(0,47)+" - Flash Player Installation";var z=h.ie&&h.win?"ActiveX":"PlugIn",q=K.title,r="MMredirectURL="+j.location+"&MMplayerType="+z+"&MMdoctitle="+q,x=w.id;if(h.ie&&h.win&&u.readyState!=4){var t=a("div");x+="SWFObjectNew";t.setAttribute("id",x);u.parentNode.insertBefore(t,u);u.style.display="none";var v=function(){u.parentNode.removeChild(u)};I(j,"onload",v)}U({data:w.expressInstall,id:m,width:w.width,height:w.height},{flashvars:r},x)}}function O(t){if(h.ie&&h.win&&t.readyState!=4){var r=a("div");t.parentNode.insertBefore(r,t);r.parentNode.replaceChild(G(t),r);t.style.display="none";var q=function(){t.parentNode.removeChild(t)};I(j,"onload",q)}else{t.parentNode.replaceChild(G(t),t)}}function G(v){var u=a("div");if(h.win&&h.ie){u.innerHTML=v.innerHTML}else{var r=v.getElementsByTagName(Q)[0];if(r){var w=r.childNodes;if(w){var q=w.length;for(var t=0;t<q;t++){if(!(w[t].nodeType==1&&w[t].nodeName=="PARAM")&&!(w[t].nodeType==8)){u.appendChild(w[t].cloneNode(true))}}}}}return u}function U(AG,AE,t){var q,v=C(t);if(v){if(typeof AG.id==b){AG.id=t}if(h.ie&&h.win){var AF="";for(var AB in AG){if(AG[AB]!=Object.prototype[AB]){if(AB.toLowerCase()=="data"){AE.movie=AG[AB]}else{if(AB.toLowerCase()=="styleclass"){AF+=' class="'+AG[AB]+'"'}else{if(AB.toLowerCase()!="classid"){AF+=" "+AB+'="'+AG[AB]+'"'}}}}}var AD="";for(var AA in AE){if(AE[AA]!=Object.prototype[AA]){AD+='<param name="'+AA+'" value="'+AE[AA]+'" />'}}v.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+AF+">"+AD+"</object>";i[i.length]=AG.id;q=C(AG.id)}else{if(h.webkit&&h.webkit<312){var AC=a("embed");AC.setAttribute("type",P);for(var z in AG){if(AG[z]!=Object.prototype[z]){if(z.toLowerCase()=="data"){AC.setAttribute("src",AG[z])}else{if(z.toLowerCase()=="styleclass"){AC.setAttribute("class",AG[z])}else{if(z.toLowerCase()!="classid"){AC.setAttribute(z,AG[z])}}}}}for(var y in AE){if(AE[y]!=Object.prototype[y]){if(y.toLowerCase()!="movie"){AC.setAttribute(y,AE[y])}}}v.parentNode.replaceChild(AC,v);q=AC}else{var u=a(Q);u.setAttribute("type",P);for(var x in AG){if(AG[x]!=Object.prototype[x]){if(x.toLowerCase()=="styleclass"){u.setAttribute("class",AG[x])}else{if(x.toLowerCase()!="classid"){u.setAttribute(x,AG[x])}}}}for(var w in AE){if(AE[w]!=Object.prototype[w]&&w.toLowerCase()!="movie"){F(u,w,AE[w])}}v.parentNode.replaceChild(u,v);q=u}}}return q}function F(t,q,r){var u=a("param");u.setAttribute("name",q);u.setAttribute("value",r);t.appendChild(u)}function X(r){var q=C(r);if(q&&(q.nodeName=="OBJECT"||q.nodeName=="EMBED")){if(h.ie&&h.win){if(q.readyState==4){B(r)}else{j.attachEvent("onload",function(){B(r)})}}else{q.parentNode.removeChild(q)}}}function B(t){var r=C(t);if(r){for(var q in r){if(typeof r[q]=="function"){r[q]=null}}r.parentNode.removeChild(r)}}function C(t){var q=null;try{q=K.getElementById(t)}catch(r){}return q}function a(q){return K.createElement(q)}function I(t,q,r){t.attachEvent(q,r);d[d.length]=[t,q,r]}function c(t){var r=h.pv,q=t.split(".");q[0]=parseInt(q[0],10);q[1]=parseInt(q[1],10)||0;q[2]=parseInt(q[2],10)||0;return(r[0]>q[0]||(r[0]==q[0]&&r[1]>q[1])||(r[0]==q[0]&&r[1]==q[1]&&r[2]>=q[2]))?true:false}function V(v,r){if(h.ie&&h.mac){return }var u=K.getElementsByTagName("head")[0],t=a("style");t.setAttribute("type","text/css");t.setAttribute("media","screen");if(!(h.ie&&h.win)&&typeof K.createTextNode!=b){t.appendChild(K.createTextNode(v+" {"+r+"}"))}u.appendChild(t);if(h.ie&&h.win&&typeof K.styleSheets!=b&&K.styleSheets.length>0){var q=K.styleSheets[K.styleSheets.length-1];if(typeof q.addRule==Q){q.addRule(v,r)}}}function W(t,q){var r=q?"visible":"hidden";if(e&&C(t)){C(t).style.visibility=r}else{V("#"+t,"visibility:"+r)}}function g(s){var r=/[\\\"<>\.;]/;var q=r.exec(s)!=null;return q?encodeURIComponent(s):s}var D=function(){if(h.ie&&h.win){window.attachEvent("onunload",function(){var w=d.length;for(var v=0;v<w;v++){d[v][0].detachEvent(d[v][1],d[v][2])}var t=i.length;for(var u=0;u<t;u++){X(i[u])}for(var r in h){h[r]=null}h=null;for(var q in swfobject){swfobject[q]=null}swfobject=null})}}();return{registerObject:function(u,q,t){if(!h.w3cdom||!u||!q){return }var r={};r.id=u;r.swfVersion=q;r.expressInstall=t?t:false;N[N.length]=r;W(u,false)},getObjectById:function(v){var q=null;if(h.w3cdom){var t=C(v);if(t){var u=t.getElementsByTagName(Q)[0];if(!u||(u&&typeof t.SetVariable!=b)){q=t}else{if(typeof u.SetVariable!=b){q=u}}}}return q},embedSWF:function(x,AE,AB,AD,q,w,r,z,AC){if(!h.w3cdom||!x||!AE||!AB||!AD||!q){return }AB+="";AD+="";if(c(q)){W(AE,false);var AA={};if(AC&&typeof AC===Q){for(var v in AC){if(AC[v]!=Object.prototype[v]){AA[v]=AC[v]}}}AA.data=x;AA.width=AB;AA.height=AD;var y={};if(z&&typeof z===Q){for(var u in z){if(z[u]!=Object.prototype[u]){y[u]=z[u]}}}if(r&&typeof r===Q){for(var t in r){if(r[t]!=Object.prototype[t]){if(typeof y.flashvars!=b){y.flashvars+="&"+t+"="+r[t]}else{y.flashvars=t+"="+r[t]}}}}f(function(){U(AA,y,AE);if(AA.id==AE){W(AE,true)}})}else{if(w&&!A&&c("6.0.65")&&(h.win||h.mac)){A=true;W(AE,false);f(function(){var AF={};AF.id=AF.altContentId=AE;AF.width=AB;AF.height=AD;AF.expressInstall=w;k(AF)})}}},getFlashPlayerVersion:function(){return{major:h.pv[0],minor:h.pv[1],release:h.pv[2]}},hasFlashPlayerVersion:c,createSWF:function(t,r,q){if(h.w3cdom){return U(t,r,q)}else{return undefined}},removeSWF:function(q){if(h.w3cdom){X(q)}},createCSS:function(r,q){if(h.w3cdom){V(r,q)}},addDomLoadEvent:f,addLoadEvent:R,getQueryParamValue:function(v){var u=K.location.search||K.location.hash;if(v==null){return g(u)}if(u){var t=u.substring(1).split("&");for(var r=0;r<t.length;r++){if(t[r].substring(0,t[r].indexOf("="))==v){return g(t[r].substring((t[r].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(A&&M){var q=C(m);if(q){q.parentNode.replaceChild(M,q);if(l){W(l,true);if(h.ie&&h.win){M.style.display="block"}}M=null;l=null;A=false}}}}}();
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/ldt/css/dashboard.css	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,5 @@
+
+#content-main-app-ldt-utils {
+    float: left;
+    width: 100%;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/ldt/css/ldt.css	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,122 @@
+#addldtform
+{
+    font-size: 16px;
+    background: #ffffff scroll repeat 0 0;
+    border: 1px solid #666666;
+    text-align: left;
+    width: 700px;
+}
+
+#addldtform .title
+{
+    color: #666666;
+    font-weight:bold !important;
+    font-size:16px;
+    position: relative;
+    padding:8px 12px;
+}
+
+#addldtform .title .closebutton
+{
+    float: right;
+    text-decoration: none;
+    color:#666666;
+}
+
+
+#addldtform .form-row
+{
+    border-bottom: 1px solid #eeeeee;
+    font-size: 15px;
+    padding: 8px 12px;
+}
+
+#addldtform label
+{
+    float: left;
+    padding: 3px 8px 0 0;
+    width:8em;
+    color: #333333 !important;
+    font-weight: bold !important;
+}
+#addldtform input
+{
+    font-size: 15px;
+    font-weight: normal;
+    padding:2px 3px;
+    vertical-align: middle;
+    margin : 2px 0;
+    background-color: #ffffff;
+    border: 1px solid #cccccc;
+}
+
+#addldtform  .checkbox
+{
+    padding: 6px 3px 3px 30px;
+}
+
+#addldtform .submit-row input
+{
+    color:black;
+    border-color:#DDDDDD #AAAAAA #AAAAAA #DDDDDD;
+    background:#dddddd;
+    padding: 3px;
+    margin:0 10px 10px 10px;
+}
+/*
+#ldtlist{
+    width:60%;
+    overflow:auto;
+    padding:1em;
+}
+*/
+#ldtlist table {
+    border-collapse: collapse;
+    border-color: #ccc;
+    width:100%;
+}
+#ldtlist table caption{
+    color:black;
+    font-size:15px;
+    font-weight:bold;
+    padding:5px;
+    text-align:left;
+    text-transform:uppercase;
+}
+#ldtlist td, th {
+    font-size: 11px;
+    line-height: 13px;
+    border-bottom: 1px solid #eee;
+    vertical-align: top;
+    padding: 5px;
+    font-family: "Lucida Grande", Verdana, Arial, sans-serif;
+}
+
+
+#ldtlist table thead {
+    color: #666;
+    padding: 2px 5px;
+    font-size: 13px;
+    background: #e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x;
+    border-left: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    white-space: nowrap;
+    vertical-align: middle;
+    font-weight: bold;
+    text-align: center;
+}
+
+#ldtlist table tbody td {
+    border-left: 1px solid #ddd;
+    text-align: center;
+}
+
+#ldtlist table tbody td:first-child {
+    border-left: 0;
+    border-right: 1px solid #ddd;
+    text-align: left;
+}
+
+#ldtlist table tfoot {
+    color: #666;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/ldt/css/style.css	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,47 @@
+#loginstate a, #loginstate a:hover, #loginstate a:visited, #loginstate a:link, #loginstate a:active {
+    color:#0063DC;
+    margin-right:4px;
+    text-decoration:none;
+}
+
+#loginstate a:hover{
+    text-decoration: underline;
+}
+
+#loginstate ul {
+    margin:0;
+    padding:0;
+    float: left;
+}
+#loginstate li{
+    display: inline;
+    padding:0;
+    margin:0;
+}
+#loginstate #user{
+    color: #000000;
+    font-weight: bold;
+    margin-right:4px;
+}
+#loginstate ul .usertool a,
+#loginstate ul .usertool a:link, 
+#loginstate ul .usertool a:visited {
+    color:#0063DC;
+    text-decoration:none;
+}
+
+#loginstate ul .usertool a:hover {
+    color:#0063DC;
+    text-decoration:underline;
+}
+
+.errorlist
+{
+    color: red;
+    font-size:12px
+}
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/ldt/css/style_base.css	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,202 @@
+body
+{   font-family: Arial, Helvetica, sans serif;
+    padding: 0px;
+    margin: 0px;
+    background-color: #f9f9f9;
+    font-size: 12px;
+}
+
+a
+{
+    color: #0045A3;
+    text-decoration:none;
+}
+
+a:hover
+{
+    color: #990000;
+    text-decoration: underline;
+}
+
+p
+{
+    font-size:12px;
+    font-weight:normal;
+    margin:0;
+    padding:0;
+}
+
+th
+{
+   text-align: left; 
+}
+.button
+{
+    margin: 3px 0;
+    margin-left: 25px;
+    background: #3366CC;
+    padding: 0 6px;
+    border-color: #6699CC #3366CC #3366CC #6699CC;
+    border-style: solid;
+    border-width: 1px 2px 2px 1px;
+    font-size: 13px;
+    font-style: normal;
+    font-weight: bold;
+    color: #ffffff;
+}
+
+.errorlist
+{
+    color: red;
+    font-size:12px
+}
+#header
+{
+    background-color: #ffffcc;
+    height: 50px;
+}
+
+#logo
+{
+}
+
+#usertool
+{
+}
+
+#loginstate
+{
+    color:#0045A3;
+}
+
+#menu
+{
+   width: 200px;
+   vertical-align: top;
+}
+
+#container
+{
+  width: 90%;
+  margin: 10px auto;
+  background-color: #fff;
+  color: #000;
+}
+}
+#content
+{
+}
+
+#footer
+{    
+}
+
+/* page login *//*
+#loginarea
+{
+    margin: 0 auto;
+    margin-top: 100px;
+    overflow: hidden;
+    width: 362px;
+    border: 2px solid #CCCCCC;
+}
+
+#loginarea .title
+{
+    font-size: 15px;
+    color: #FFFFFF;
+    background: #990000 scroll repeat left top;
+    font-weight:bold;
+    height:34px;
+    position: relative;
+    line-height: 34px;
+    overflow: hidden;
+    text-transform: uppercase;
+}
+
+#loginarea .title div
+{
+    margin-left: 12px;
+}
+
+#loginarea .login-form
+{
+    margin-top:20px;
+    margin-left:25px;
+} 
+
+#loginarea .login-form .inputbox
+{
+    font-size: 13px;
+    line-height:20px;
+    text-align: left; 
+}
+
+#loginarea .login-form label
+{
+    font-size: 14px;
+    font-weight: bold;
+}
+/*
+#loginarea .login-form .button
+{
+    margin: 3px 0;
+    margin-left: 25px;
+    background: #3366CC;
+    padding: 0 6px;
+    border-color: #6699CC #3366CC #3366CC #6699CC;
+    border-style: solid;
+    border-width: 1px 2px 2px 1px;
+    font-size: 13px;
+    font-style: normal;
+    font-weight: bold;
+    color: #ffffff;
+}
+
+#loginarea a
+{
+    font-size: 12px;
+    background:url("norm_left.gif") no-repeat left top;
+    padding:5px 15px;
+    margin: 5px;
+}
+
+#nav {
+    float:left;
+    width:100%;
+    font-size:93%;
+    line-height:normal;
+    background:#828282 repeat-x scroll 0 0;
+    margin:0;
+    padding:0;
+    list-style:none;
+}
+
+#nav a:link, 
+#nav a:visited {
+    color:#fff;
+    background:#828282 repeat-x scroll 0 0;
+    padding:20px 40px 4px 10px;
+    float:left;
+    width:auto;
+    border-right:1px solid #999999;
+}
+
+#nav li a:hover {
+    color:#fff;
+    background:#999999 none repeat scroll 0 0;
+}
+
+#space #nav-space a, #profile  #nav-profile a
+{
+    background:#666666 none repeat scroll 0 0;
+}
+
+#space  #nav-space, #profile  #nav-profile
+{
+    background:#666666 none repeat scroll 0 0;
+    color:#FFFFFF;
+}
+*/
+
+
Binary file web/static/ldt/img/loadingAnimation.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/ldt/js/jquery.DOMWindow.js	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,372 @@
+(function($){
+	
+	//closeDOMWindow
+	$.fn.closeDOMWindow = function(settings){
+		
+		if(!settings){settings={};}
+		
+		var run = function(passingThis){
+			
+			if(settings.anchoredClassName){
+				var $anchorClassName = $('.'+settings.anchoredClassName);
+				$anchorClassName.fadeOut('fast',function(){
+					if($.fn.draggable){
+						$anchorClassName.draggable('destory').trigger("unload").remove();	
+					}else{
+						$anchorClassName.trigger("unload").remove();
+					}
+				});
+				if(settings.functionCallOnClose){settings.functionCallAfterClose();}
+			}else{
+				var $DOMWindowOverlay = $('#DOMWindowOverlay');
+				var $DOMWindow = $('#DOMWindow');
+				$DOMWindowOverlay.fadeOut('fast',function(){
+					$DOMWindowOverlay.trigger('unload').unbind().remove();																	  
+				});
+				$DOMWindow.fadeOut('fast',function(){
+					if($.fn.draggable){
+						$DOMWindow.draggable("destroy").trigger("unload").remove();
+					}else{
+						$DOMWindow.trigger("unload").remove();
+					}
+				});
+			
+				$(window).unbind('scroll.DOMWindow');
+				$(window).unbind('resize.DOMWindow');
+				
+				if($.fn.openDOMWindow.isIE6){$('#DOMWindowIE6FixIframe').remove();}
+				if(settings.functionCallOnClose){settings.functionCallAfterClose();}
+			}	
+		};
+		
+		if(settings.eventType){//if used with $().
+			return this.each(function(index){
+				$(this).bind(settings.eventType, function(){
+					run(this);
+					return false;
+				});
+			});
+		}else{//else called as $.function
+			run();
+		}
+		
+	};
+	
+	//allow for public call, pass settings
+	$.closeDOMWindow = function(s){$.fn.closeDOMWindow(s);};
+	
+	//openDOMWindow
+	$.fn.openDOMWindow = function(instanceSettings){	
+		
+		var shortcut =  $.fn.openDOMWindow;
+	
+		//default settings combined with callerSettings////////////////////////////////////////////////////////////////////////
+		
+		shortcut.defaultsSettings = {
+			anchoredClassName:'',
+			anchoredSelector:'',
+			borderColor:'#ccc',
+			borderSize:'4',
+			draggable:0,
+			eventType:null, //click, blur, change, dblclick, error, focus, load, mousedown, mouseout, mouseup etc...
+			fixedWindowY:100,
+			functionCallOnOpen:null,
+			functionCallOnClose:null,
+			height:500,
+			loader:0,
+			loaderHeight:0,
+			loaderImagePath:'',
+			loaderWidth:0,
+			modal:0,
+			overlay:1,
+			overlayColor:'#000',
+			overlayOpacity:'85',
+			positionLeft:0,
+			positionTop:0,
+			positionType:'centered', // centered, anchored, absolute, fixed
+			width:500, 
+			windowBGColor:'#fff',
+			windowBGImage:null, // http path
+			windowHTTPType:'get',
+			windowPadding:10,
+			windowSource:'inline', //inline, ajax, iframe
+			windowSourceID:'',
+			windowSourceURL:'',
+			windowSourceAttrURL:'href',
+			windowOverflow : 'auto',
+			ajaxParameters : {}
+		};
+		
+		var settings = $.extend({}, $.fn.openDOMWindow.defaultsSettings , instanceSettings || {});
+		
+		//Public functions
+		
+		shortcut.viewPortHeight = function(){ return self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;};
+		shortcut.viewPortWidth = function(){ return self.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;};
+		shortcut.scrollOffsetHeight = function(){ return self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;};
+		shortcut.scrollOffsetWidth = function(){ return self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;};
+		shortcut.isIE6 = typeof document.body.style.maxHeight === "undefined";
+		
+		//Private Functions/////////////////////////////////////////////////////////////////////////////////////////////////////////
+		
+		var sizeOverlay = function(){
+			var $DOMWindowOverlay = $('#DOMWindowOverlay');
+			if(shortcut.isIE6){//if IE 6
+				var overlayViewportHeight = document.documentElement.offsetHeight + document.documentElement.scrollTop - 4;
+				var overlayViewportWidth = document.documentElement.offsetWidth - 21;
+				$DOMWindowOverlay.css({'height':overlayViewportHeight +'px','width':overlayViewportWidth+'px'});
+			}else{//else Firefox, safari, opera, IE 7+
+				$DOMWindowOverlay.css({'height':'100%','width':'100%','position':'fixed'});
+			}	
+		};
+		
+		var sizeIE6Iframe = function(){
+			var overlayViewportHeight = document.documentElement.offsetHeight + document.documentElement.scrollTop - 4;
+			var overlayViewportWidth = document.documentElement.offsetWidth - 21;
+			$('#DOMWindowIE6FixIframe').css({'height':overlayViewportHeight +'px','width':overlayViewportWidth+'px'});
+		};
+		
+		var centerDOMWindow = function() {
+			var $DOMWindow = $('#DOMWindow');
+			if(settings.height + 50 > shortcut.viewPortHeight()){//added 50 to be safe
+				$DOMWindow.css('left',Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindow.outerWidth())/2));
+			}else{
+				$DOMWindow.css('left',Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindow.outerWidth())/2));
+				$DOMWindow.css('top',Math.round(shortcut.viewPortHeight()/2) + shortcut.scrollOffsetHeight() - Math.round(($DOMWindow.outerHeight())/2));
+			}
+		};
+		
+		var centerLoader = function() {
+			var $DOMWindowLoader = $('#DOMWindowLoader');
+			if(shortcut.isIE6){//if IE 6
+				$DOMWindowLoader.css({'left':Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindowLoader.innerWidth())/2),'position':'absolute'});
+				$DOMWindowLoader.css({'top':Math.round(shortcut.viewPortHeight()/2) + shortcut.scrollOffsetHeight() - Math.round(($DOMWindowLoader.innerHeight())/2),'position':'absolute'});
+			}else{
+				$DOMWindowLoader.css({'left':'50%','top':'50%','position':'fixed'});
+			}
+			
+		};
+		
+		var fixedDOMWindow = function(){
+			var $DOMWindow = $('#DOMWindow');
+			$DOMWindow.css('left', settings.positionLeft + shortcut.scrollOffsetWidth());
+			$DOMWindow.css('top', + settings.positionTop + shortcut.scrollOffsetHeight());
+		};
+		
+		var showDOMWindow = function(instance){
+			if(arguments[0]){
+				$('.'+instance+' #DOMWindowLoader').remove();
+				$('.'+instance+' #DOMWindowContent').fadeIn('fast',function(){if(settings.functionCallOnOpen){settings.functionCallOnOpen();}});
+				$('.'+instance+ '.closeDOMWindow').click(function(){
+					$.closeDOMWindow();	
+					return false;
+				});
+			}else{
+				$('#DOMWindowLoader').remove();
+				$('#DOMWindow').fadeIn('fast',function(){if(settings.functionCallOnOpen){settings.functionCallOnOpen();}});
+				$('#DOMWindow .closeDOMWindow').click(function(){						
+					$.closeDOMWindow();
+					return false;
+				});
+			}
+			
+		};
+		
+		var urlQueryToObject = function(s, q){
+			  var query = typeof(q) != 'undefined' ? q : {};
+			  s.replace(/b([^&=]*)=([^&=]*)b/g, function (m, a, d) {
+				if (typeof query[a] != 'undefined') {
+				  query[a] += ',' + d;
+				} else {
+				  query[a] = d;
+				}
+			  });
+			  return query;
+		};
+			
+		//Run Routine ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
+		var run = function(passingThis){
+			
+			//get values from element clicked, or assume its passed as an option
+			settings.windowSourceID = $(passingThis).attr('href') || settings.windowSourceID;
+			settings.windowSourceURL = $(passingThis).attr(settings.windowSourceAttrURL) || settings.windowSourceURL;
+			settings.windowBGImage = settings.windowBGImage ? 'background-image:url('+settings.windowBGImage+')' : '';
+			var urlOnly, urlQueryObject;
+			
+			if(settings.positionType == 'anchored'){//anchored DOM window
+				
+				var anchoredPositions = $(settings.anchoredSelector).position();
+				var anchoredPositionX = anchoredPositions.left + settings.positionLeft;
+				var anchoredPositionY = anchoredPositions.top + settings.positionTop;
+				
+				$('body').append('<div class="'+settings.anchoredClassName+'" style="'+settings.windowBGImage+';background-repeat:no-repeat;padding:'+settings.windowPadding+'px;overflow:'+settings.windowOverflow+';position:absolute;top:'+anchoredPositionY+'px;left:'+anchoredPositionX+'px;height:'+settings.height+'px;width:'+settings.width+'px;background-color:'+settings.windowBGColor+';border:'+settings.borderSize+'px solid '+settings.borderColor+';z-index:10001"><div id="DOMWindowContent" style="display:none"></div></div>');		
+				//loader
+				if(settings.loader && settings.loaderImagePath !== ''){
+					$('.'+settings.anchoredClassName).append('<div id="DOMWindowLoader" style="width:'+settings.loaderWidth+'px;height:'+settings.loaderHeight+'px;"><img src="'+settings.loaderImagePath+'" /></div>');
+					
+				}
+
+				if($.fn.draggable){
+					if(settings.draggable){$('.' + settings.anchoredClassName).draggable({cursor:'move'});}
+				}
+				
+				switch(settings.windowSource){
+					case 'inline'://////////////////////////////// inline //////////////////////////////////////////
+						$('.' + settings.anchoredClassName+" #DOMWindowContent").append($(settings.windowSourceID).children());
+						$('.' + settings.anchoredClassName).unload(function(){// move elements back when you're finished
+							$('.' + settings.windowSourceID).append( $('.' + settings.anchoredClassName+" #DOMWindowContent").children());				
+						});
+						showDOMWindow(settings.anchoredClassName);
+					break;
+					case 'iframe'://////////////////////////////// iframe //////////////////////////////////////////
+						$('.' + settings.anchoredClassName+" #DOMWindowContent").append('<iframe frameborder="0" hspace="0" wspace="0" src="'+settings.windowSourceURL+'" name="DOMWindowIframe'+Math.round(Math.random()*1000)+'" style="width:100%;height:100%;border:none;background-color:#fff;overflow:'+settings.windowOverflow+';" class="'+settings.anchoredClassName+'Iframe" ></iframe>');
+						$('.'+settings.anchoredClassName+'Iframe').load(showDOMWindow(settings.anchoredClassName));
+					break;
+					case 'ajax'://////////////////////////////// ajax //////////////////////////////////////////	
+						if(settings.windowHTTPType == 'post'){
+							
+							if(settings.windowSourceURL.indexOf("?") !== -1){//has a query string
+								urlOnly = settings.windowSourceURL.substr(0, settings.windowSourceURL.indexOf("?"));
+								urlQueryObject = urlQueryToObject(settings.windowSourceURL, settings.ajaxParameters);
+							}else{
+								urlOnly = settings.windowSourceURL;
+								urlQueryObject = settings.ajaxParameters;
+							}
+							$('.' + settings.anchoredClassName+" #DOMWindowContent").load(urlOnly,urlQueryObject,function(){
+								showDOMWindow(settings.anchoredClassName);
+							});
+						}else{
+							if(settings.windowSourceURL.indexOf("?") == -1){ //no query string, so add one
+								settings.windowSourceURL += '?';
+							}
+							$('.' + settings.anchoredClassName+" #DOMWindowContent").load(
+								settings.windowSourceURL + '&random=' + (new Date().getTime()),function(){
+								showDOMWindow(settings.anchoredClassName);
+							});
+						}
+					break;
+				}
+				
+			}else{//centered, fixed, absolute DOM window
+				
+				//overlay & modal
+				if(settings.overlay){
+					$('body').append('<div id="DOMWindowOverlay" style="z-index:10000;display:none;position:absolute;top:0;left:0;background-color:'+settings.overlayColor+';filter:alpha(opacity='+settings.overlayOpacity+');-moz-opacity: 0.'+settings.overlayOpacity+';opacity: 0.'+settings.overlayOpacity+';"></div>');
+					if(shortcut.isIE6){//if IE 6
+						$('body').append('<iframe id="DOMWindowIE6FixIframe"  src="blank.html"  style="width:100%;height:100%;z-index:9999;position:absolute;top:0;left:0;filter:alpha(opacity=0);"></iframe>');
+						sizeIE6Iframe();
+					}
+					sizeOverlay();
+					var $DOMWindowOverlay = $('#DOMWindowOverlay');
+					$DOMWindowOverlay.fadeIn('fast');
+					if(!settings.modal){$DOMWindowOverlay.click(function(){$.closeDOMWindow();});}
+				}
+				
+				//loader
+				if(settings.loader && settings.loaderImagePath !== ''){
+					$('body').append('<div id="DOMWindowLoader" style="z-index:10002;width:'+settings.loaderWidth+'px;height:'+settings.loaderHeight+'px;"><img src="'+settings.loaderImagePath+'" /></div>');
+					centerLoader();
+				}
+
+				//add DOMwindow
+				$('body').append('<div id="DOMWindow" style="background-repeat:no-repeat;'+settings.windowBGImage+';overflow:'+settings.windowOverflow+';padding:'+settings.windowPadding+'px;display:none;height:'+settings.height+'px;width:'+settings.width+'px;background-color:'+settings.windowBGColor+';border:'+settings.borderSize+'px solid '+settings.borderColor+'; position:absolute;z-index:10001"></div>');
+				
+				var $DOMWindow = $('#DOMWindow');
+				//centered, absolute, or fixed
+				switch(settings.positionType){
+					case 'centered':
+						centerDOMWindow();
+						if(settings.height + 50 > shortcut.viewPortHeight()){//added 50 to be safe
+							$DOMWindow.css('top', (settings.fixedWindowY + shortcut.scrollOffsetHeight()) + 'px');
+						}
+					break;
+					case 'absolute':
+						$DOMWindow.css({'top':(settings.positionTop+shortcut.scrollOffsetHeight())+'px','left':(settings.positionLeft+shortcut.scrollOffsetWidth())+'px'});
+						if($.fn.draggable){
+							if(settings.draggable){$DOMWindow.draggable({cursor:'move'});}
+						}
+					break;
+					case 'fixed':
+						fixedDOMWindow();
+					break;
+					case 'anchoredSingleWindow':
+						var anchoredPositions = $(settings.anchoredSelector).position();
+						var anchoredPositionX = anchoredPositions.left + settings.positionLeft;
+						var anchoredPositionY = anchoredPositions.top + settings.positionTop;
+						$DOMWindow.css({'top':anchoredPositionY + 'px','left':anchoredPositionX+'px'});
+								
+					break;
+				}
+				
+				$(window).bind('scroll.DOMWindow',function(){
+					if(settings.overlay){sizeOverlay();}
+					if(shortcut.isIE6){sizeIE6Iframe();}
+					if(settings.positionType == 'centered'){centerDOMWindow();}
+					if(settings.positionType == 'fixed'){fixedDOMWindow();}
+				});
+
+				$(window).bind('resize.DOMWindow',function(){
+					if(shortcut.isIE6){sizeIE6Iframe();}
+					if(settings.overlay){sizeOverlay();}
+					if(settings.positionType == 'centered'){centerDOMWindow();}
+				});
+				
+				switch(settings.windowSource){
+					case 'inline'://////////////////////////////// inline //////////////////////////////////////////
+						$DOMWindow.append($(settings.windowSourceID).children());
+						$DOMWindow.unload(function(){// move elements back when you're finished
+							$(settings.windowSourceID).append($DOMWindow.children());				
+						});
+						showDOMWindow();
+					break;
+					case 'iframe'://////////////////////////////// iframe //////////////////////////////////////////
+						var name = 'DOMWindowIframe'+Math.round(Math.random()*1000);
+						$DOMWindow.append('<iframe frameborder="0" hspace="0" wspace="0" src="'+settings.windowSourceURL+'" name="'+name+'" style="width:100%;height:100%;border:none;background-color:#fff;overflow:'+settings.windowOverflow+';" id="DOMWindowIframe" ></iframe>');
+						$('#DOMWindowIframe').load(showDOMWindow());
+					break;
+					case 'ajax'://////////////////////////////// ajax //////////////////////////////////////////
+						if(settings.windowHTTPType == 'post'){
+							
+							if(settings.windowSourceURL.indexOf("?") !== -1){//has a query string
+								urlOnly = settings.windowSourceURL.substr(0, settings.windowSourceURL.indexOf("?"));
+								urlQueryObject = urlQueryToObject(settings.windowSourceURL, settings.ajaxParameters);
+							}else{
+								urlOnly = settings.windowSourceURL;
+								urlQueryObject = settings.ajaxParameters;
+							}
+							$DOMWindow.load(urlOnly,urlQueryObject,function(){
+								showDOMWindow();
+							});
+						}else{
+							if(settings.windowSourceURL.indexOf("?") == -1){ //no query string, so add one
+								settings.windowSourceURL += '?';
+							}
+							$DOMWindow.load(
+								settings.windowSourceURL + '&random=' + (new Date().getTime()),function(){
+								showDOMWindow();
+							});
+						}
+					break;
+				}
+				
+			}//end if anchored, or absolute, fixed, centered
+			
+		};//end run()
+		
+		if(settings.eventType){//if used with $().
+			return this.each(function(index){				  
+				$(this).bind(settings.eventType,function(){
+					run(this);
+					return false;
+				});
+			});	
+		}else{//else called as $.function
+			run();
+		}
+		
+	};//end function openDOMWindow
+	
+	//allow for public call, pass settings
+	$.openDOMWindow = function(s){$.fn.openDOMWindow(s);};
+	
+})(jQuery);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/ldt/js/jquery.js	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,19 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/ldt/js/jquery.validate.js	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,1131 @@
+/*
+ * jQuery validation plug-in 1.5.5
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
+ * http://docs.jquery.com/Plugins/Validation
+ *
+ * Copyright (c) 2006 - 2008 Jörn Zaefferer
+ *
+ * $Id: jquery.validate.js 6403 2009-06-17 14:27:16Z joern.zaefferer $
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ */
+
+(function($) {
+
+$.extend($.fn, {
+	// http://docs.jquery.com/Plugins/Validation/validate
+	validate: function( options ) {
+
+		// if nothing is selected, return nothing; can't chain anyway
+		if (!this.length) {
+			options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
+			return;
+		}
+
+		// check if a validator for this form was already created
+		var validator = $.data(this[0], 'validator');
+		if ( validator ) {
+			return validator;
+		}
+		
+		validator = new $.validator( options, this[0] );
+		$.data(this[0], 'validator', validator); 
+		
+		if ( validator.settings.onsubmit ) {
+		
+			// allow suppresing validation by adding a cancel class to the submit button
+			this.find("input, button").filter(".cancel").click(function() {
+				validator.cancelSubmit = true;
+			});
+			
+			// when a submitHandler is used, capture the submitting button
+			if (validator.settings.submitHandler) {
+				this.find("input, button").filter(":submit").click(function() {
+					validator.submitButton = this;
+				});
+			}
+		
+			// validate the form on submit
+			this.submit( function( event ) {
+				if ( validator.settings.debug )
+					// prevent form submit to be able to see console output
+					event.preventDefault();
+					
+				function handle() {
+					if ( validator.settings.submitHandler ) {
+						if (validator.submitButton) {
+							// insert a hidden input as a replacement for the missing submit button
+							var hidden = $("<input type='hidden'/>").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm);
+						}
+						validator.settings.submitHandler.call( validator, validator.currentForm );
+						if (validator.submitButton) {
+							// and clean up afterwards; thanks to no-block-scope, hidden can be referenced
+							hidden.remove();
+						}
+						return false;
+					}
+					return true;
+				}
+					
+				// prevent submit for invalid forms or custom submit handlers
+				if ( validator.cancelSubmit ) {
+					validator.cancelSubmit = false;
+					return handle();
+				}
+				if ( validator.form() ) {
+					if ( validator.pendingRequest ) {
+						validator.formSubmitted = true;
+						return false;
+					}
+					return handle();
+				} else {
+					validator.focusInvalid();
+					return false;
+				}
+			});
+		}
+		
+		return validator;
+	},
+	// http://docs.jquery.com/Plugins/Validation/valid
+	valid: function() {
+        if ( $(this[0]).is('form')) {
+            return this.validate().form();
+        } else {
+            var valid = true;
+            var validator = $(this[0].form).validate();
+            this.each(function() {
+				valid &= validator.element(this);
+            });
+            return valid;
+        }
+    },
+	// attributes: space seperated list of attributes to retrieve and remove
+	removeAttrs: function(attributes) {
+		var result = {},
+			$element = this;
+		$.each(attributes.split(/\s/), function(index, value) {
+			result[value] = $element.attr(value);
+			$element.removeAttr(value);
+		});
+		return result;
+	},
+	// http://docs.jquery.com/Plugins/Validation/rules
+	rules: function(command, argument) {
+		var element = this[0];
+		
+		if (command) {
+			var settings = $.data(element.form, 'validator').settings;
+			var staticRules = settings.rules;
+			var existingRules = $.validator.staticRules(element);
+			switch(command) {
+			case "add":
+				$.extend(existingRules, $.validator.normalizeRule(argument));
+				staticRules[element.name] = existingRules;
+				if (argument.messages)
+					settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );
+				break;
+			case "remove":
+				if (!argument) {
+					delete staticRules[element.name];
+					return existingRules;
+				}
+				var filtered = {};
+				$.each(argument.split(/\s/), function(index, method) {
+					filtered[method] = existingRules[method];
+					delete existingRules[method];
+				});
+				return filtered;
+			}
+		}
+		
+		var data = $.validator.normalizeRules(
+		$.extend(
+			{},
+			$.validator.metadataRules(element),
+			$.validator.classRules(element),
+			$.validator.attributeRules(element),
+			$.validator.staticRules(element)
+		), element);
+		
+		// make sure required is at front
+		if (data.required) {
+			var param = data.required;
+			delete data.required;
+			data = $.extend({required: param}, data);
+		}
+		
+		return data;
+	}
+});
+
+// Custom selectors
+$.extend($.expr[":"], {
+	// http://docs.jquery.com/Plugins/Validation/blank
+	blank: function(a) {return !$.trim(a.value);},
+	// http://docs.jquery.com/Plugins/Validation/filled
+	filled: function(a) {return !!$.trim(a.value);},
+	// http://docs.jquery.com/Plugins/Validation/unchecked
+	unchecked: function(a) {return !a.checked;}
+});
+
+// constructor for validator
+$.validator = function( options, form ) {
+	this.settings = $.extend( {}, $.validator.defaults, options );
+	this.currentForm = form;
+	this.init();
+};
+
+$.validator.format = function(source, params) {
+	if ( arguments.length == 1 ) 
+		return function() {
+			var args = $.makeArray(arguments);
+			args.unshift(source);
+			return $.validator.format.apply( this, args );
+		};
+	if ( arguments.length > 2 && params.constructor != Array  ) {
+		params = $.makeArray(arguments).slice(1);
+	}
+	if ( params.constructor != Array ) {
+		params = [ params ];
+	}
+	$.each(params, function(i, n) {
+		source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
+	});
+	return source;
+};
+
+$.extend($.validator, {
+	
+	defaults: {
+		messages: {},
+		groups: {},
+		rules: {},
+		errorClass: "error",
+		validClass: "valid",
+		errorElement: "label",
+		focusInvalid: true,
+		errorContainer: $( [] ),
+		errorLabelContainer: $( [] ),
+		onsubmit: true,
+		ignore: [],
+		ignoreTitle: false,
+		onfocusin: function(element) {
+			this.lastActive = element;
+				
+			// hide error label and remove error class on focus if enabled
+			if ( this.settings.focusCleanup && !this.blockFocusCleanup ) {
+				this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
+				this.errorsFor(element).hide();
+			}
+		},
+		onfocusout: function(element) {
+			if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
+				this.element(element);
+			}
+		},
+		onkeyup: function(element) {
+			if ( element.name in this.submitted || element == this.lastElement ) {
+				this.element(element);
+			}
+		},
+		onclick: function(element) {
+			if ( element.name in this.submitted )
+				this.element(element);
+		},
+		highlight: function( element, errorClass, validClass ) {
+			$(element).addClass(errorClass).removeClass(validClass);
+		},
+		unhighlight: function( element, errorClass, validClass ) {
+			$(element).removeClass(errorClass).addClass(validClass);
+		}
+	},
+
+	// http://docs.jquery.com/Plugins/Validation/Validator/setDefaults
+	setDefaults: function(settings) {
+		$.extend( $.validator.defaults, settings );
+	},
+
+	messages: {
+		required: "This field is required.",
+		remote: "Please fix this field.",
+		email: "Please enter a valid email address.",
+		url: "Please enter a valid URL.",
+		date: "Please enter a valid date.",
+		dateISO: "Please enter a valid date (ISO).",
+		dateDE: "Bitte geben Sie ein gültiges Datum ein.",
+		number: "Please enter a valid number.",
+		numberDE: "Bitte geben Sie eine Nummer ein.",
+		digits: "Please enter only digits",
+		creditcard: "Please enter a valid credit card number.",
+		equalTo: "Please enter the same value again.",
+		accept: "Please enter a value with a valid extension.",
+		maxlength: $.validator.format("Please enter no more than {0} characters."),
+		minlength: $.validator.format("Please enter at least {0} characters."),
+		rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
+		range: $.validator.format("Please enter a value between {0} and {1}."),
+		max: $.validator.format("Please enter a value less than or equal to {0}."),
+		min: $.validator.format("Please enter a value greater than or equal to {0}.")
+	},
+	
+	autoCreateRanges: false,
+	
+	prototype: {
+		
+		init: function() {
+			this.labelContainer = $(this.settings.errorLabelContainer);
+			this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
+			this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );
+			this.submitted = {};
+			this.valueCache = {};
+			this.pendingRequest = 0;
+			this.pending = {};
+			this.invalid = {};
+			this.reset();
+			
+			var groups = (this.groups = {});
+			$.each(this.settings.groups, function(key, value) {
+				$.each(value.split(/\s/), function(index, name) {
+					groups[name] = key;
+				});
+			});
+			var rules = this.settings.rules;
+			$.each(rules, function(key, value) {
+				rules[key] = $.validator.normalizeRule(value);
+			});
+			
+			function delegate(event) {
+				var validator = $.data(this[0].form, "validator");
+				validator.settings["on" + event.type] && validator.settings["on" + event.type].call(validator, this[0] );
+			}
+			$(this.currentForm)
+				.delegate("focusin focusout keyup", ":text, :password, :file, select, textarea", delegate)
+				.delegate("click", ":radio, :checkbox", delegate);
+
+			if (this.settings.invalidHandler)
+				$(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
+		},
+
+		// http://docs.jquery.com/Plugins/Validation/Validator/form
+		form: function() {
+			this.checkForm();
+			$.extend(this.submitted, this.errorMap);
+			this.invalid = $.extend({}, this.errorMap);
+			if (!this.valid())
+				$(this.currentForm).triggerHandler("invalid-form", [this]);
+			this.showErrors();
+			return this.valid();
+		},
+		
+		checkForm: function() {
+			this.prepareForm();
+			for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {
+				this.check( elements[i] );
+			}
+			return this.valid(); 
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Validator/element
+		element: function( element ) {
+			element = this.clean( element );
+			this.lastElement = element;
+			this.prepareElement( element );
+			this.currentElements = $(element);
+			var result = this.check( element );
+			if ( result ) {
+				delete this.invalid[element.name];
+			} else {
+				this.invalid[element.name] = true;
+			}
+			if ( !this.numberOfInvalids() ) {
+				// Hide error containers on last error
+				this.toHide = this.toHide.add( this.containers );
+			}
+			this.showErrors();
+			return result;
+		},
+
+		// http://docs.jquery.com/Plugins/Validation/Validator/showErrors
+		showErrors: function(errors) {
+			if(errors) {
+				// add items to error list and map
+				$.extend( this.errorMap, errors );
+				this.errorList = [];
+				for ( var name in errors ) {
+					this.errorList.push({
+						message: errors[name],
+						element: this.findByName(name)[0]
+					});
+				}
+				// remove items from success list
+				this.successList = $.grep( this.successList, function(element) {
+					return !(element.name in errors);
+				});
+			}
+			this.settings.showErrors
+				? this.settings.showErrors.call( this, this.errorMap, this.errorList )
+				: this.defaultShowErrors();
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Validator/resetForm
+		resetForm: function() {
+			if ( $.fn.resetForm )
+				$( this.currentForm ).resetForm();
+			this.submitted = {};
+			this.prepareForm();
+			this.hideErrors();
+			this.elements().removeClass( this.settings.errorClass );
+		},
+		
+		numberOfInvalids: function() {
+			return this.objectLength(this.invalid);
+		},
+		
+		objectLength: function( obj ) {
+			var count = 0;
+			for ( var i in obj )
+				count++;
+			return count;
+		},
+		
+		hideErrors: function() {
+			this.addWrapper( this.toHide ).hide();
+		},
+		
+		valid: function() {
+			return this.size() == 0;
+		},
+		
+		size: function() {
+			return this.errorList.length;
+		},
+		
+		focusInvalid: function() {
+			if( this.settings.focusInvalid ) {
+				try {
+					$(this.findLastActive() || this.errorList.length && this.errorList[0].element || []).filter(":visible").focus();
+				} catch(e) {
+					// ignore IE throwing errors when focusing hidden elements
+				}
+			}
+		},
+		
+		findLastActive: function() {
+			var lastActive = this.lastActive;
+			return lastActive && $.grep(this.errorList, function(n) {
+				return n.element.name == lastActive.name;
+			}).length == 1 && lastActive;
+		},
+		
+		elements: function() {
+			var validator = this,
+				rulesCache = {};
+			
+			// select all valid inputs inside the form (no submit or reset buttons)
+			// workaround $Query([]).add until http://dev.jquery.com/ticket/2114 is solved
+			return $([]).add(this.currentForm.elements)
+			.filter(":input")
+			.not(":submit, :reset, :image, [disabled]")
+			.not( this.settings.ignore )
+			.filter(function() {
+				!this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this);
+			
+				// select only the first element for each name, and only those with rules specified
+				if ( this.name in rulesCache || !validator.objectLength($(this).rules()) )
+					return false;
+				
+				rulesCache[this.name] = true;
+				return true;
+			});
+		},
+		
+		clean: function( selector ) {
+			return $( selector )[0];
+		},
+		
+		errors: function() {
+			return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext );
+		},
+		
+		reset: function() {
+			this.successList = [];
+			this.errorList = [];
+			this.errorMap = {};
+			this.toShow = $([]);
+			this.toHide = $([]);
+			this.formSubmitted = false;
+			this.currentElements = $([]);
+		},
+		
+		prepareForm: function() {
+			this.reset();
+			this.toHide = this.errors().add( this.containers );
+		},
+		
+		prepareElement: function( element ) {
+			this.reset();
+			this.toHide = this.errorsFor(element);
+		},
+	
+		check: function( element ) {
+			element = this.clean( element );
+			
+			// if radio/checkbox, validate first element in group instead
+			if (this.checkable(element)) {
+				element = this.findByName( element.name )[0];
+			}
+			
+			var rules = $(element).rules();
+			var dependencyMismatch = false;
+			for( method in rules ) {
+				var rule = { method: method, parameters: rules[method] };
+				try {
+					var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters );
+					
+					// if a method indicates that the field is optional and therefore valid,
+					// don't mark it as valid when there are no other rules
+					if ( result == "dependency-mismatch" ) {
+						dependencyMismatch = true;
+						continue;
+					}
+					dependencyMismatch = false;
+					
+					if ( result == "pending" ) {
+						this.toHide = this.toHide.not( this.errorsFor(element) );
+						return;
+					}
+					
+					if( !result ) {
+						this.formatAndAdd( element, rule );
+						return false;
+					}
+				} catch(e) {
+					this.settings.debug && window.console && console.log("exception occured when checking element " + element.id
+						 + ", check the '" + rule.method + "' method");
+					throw e;
+				}
+			}
+			if (dependencyMismatch)
+				return;
+			if ( this.objectLength(rules) )
+				this.successList.push(element);
+			return true;
+		},
+		
+		// return the custom message for the given element and validation method
+		// specified in the element's "messages" metadata
+		customMetaMessage: function(element, method) {
+			if (!$.metadata)
+				return;
+			
+			var meta = this.settings.meta
+				? $(element).metadata()[this.settings.meta]
+				: $(element).metadata();
+			
+			return meta && meta.messages && meta.messages[method];
+		},
+		
+		// return the custom message for the given element name and validation method
+		customMessage: function( name, method ) {
+			var m = this.settings.messages[name];
+			return m && (m.constructor == String
+				? m
+				: m[method]);
+		},
+		
+		// return the first defined argument, allowing empty strings
+		findDefined: function() {
+			for(var i = 0; i < arguments.length; i++) {
+				if (arguments[i] !== undefined)
+					return arguments[i];
+			}
+			return undefined;
+		},
+		
+		defaultMessage: function( element, method) {
+			return this.findDefined(
+				this.customMessage( element.name, method ),
+				this.customMetaMessage( element, method ),
+				// title is never undefined, so handle empty string as undefined
+				!this.settings.ignoreTitle && element.title || undefined,
+				$.validator.messages[method],
+				"<strong>Warning: No message defined for " + element.name + "</strong>"
+			);
+		},
+		
+		formatAndAdd: function( element, rule ) {
+			var message = this.defaultMessage( element, rule.method );
+			if ( typeof message == "function" ) 
+				message = message.call(this, rule.parameters, element);
+			this.errorList.push({
+				message: message,
+				element: element
+			});
+			this.errorMap[element.name] = message;
+			this.submitted[element.name] = message;
+		},
+		
+		addWrapper: function(toToggle) {
+			if ( this.settings.wrapper )
+				toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
+			return toToggle;
+		},
+		
+		defaultShowErrors: function() {
+			for ( var i = 0; this.errorList[i]; i++ ) {
+				var error = this.errorList[i];
+				this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
+				this.showLabel( error.element, error.message );
+			}
+			if( this.errorList.length ) {
+				this.toShow = this.toShow.add( this.containers );
+			}
+			if (this.settings.success) {
+				for ( var i = 0; this.successList[i]; i++ ) {
+					this.showLabel( this.successList[i] );
+				}
+			}
+			if (this.settings.unhighlight) {
+				for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {
+					this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass );
+				}
+			}
+			this.toHide = this.toHide.not( this.toShow );
+			this.hideErrors();
+			this.addWrapper( this.toShow ).show();
+		},
+		
+		validElements: function() {
+			return this.currentElements.not(this.invalidElements());
+		},
+		
+		invalidElements: function() {
+			return $(this.errorList).map(function() {
+				return this.element;
+			});
+		},
+		
+		showLabel: function(element, message) {
+			var label = this.errorsFor( element );
+			if ( label.length ) {
+				// refresh error/success class
+				label.removeClass().addClass( this.settings.errorClass );
+			
+				// check if we have a generated label, replace the message then
+				label.attr("generated") && label.html(message);
+			} else {
+				// create label
+				label = $("<" + this.settings.errorElement + "/>")
+					.attr({"for":  this.idOrName(element), generated: true})
+					.addClass(this.settings.errorClass)
+					.html(message || "");
+				if ( this.settings.wrapper ) {
+					// make sure the element is visible, even in IE
+					// actually showing the wrapped element is handled elsewhere
+					label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
+				}
+				if ( !this.labelContainer.append(label).length )
+					this.settings.errorPlacement
+						? this.settings.errorPlacement(label, $(element) )
+						: label.insertAfter(element);
+			}
+			if ( !message && this.settings.success ) {
+				label.text("");
+				typeof this.settings.success == "string"
+					? label.addClass( this.settings.success )
+					: this.settings.success( label );
+			}
+			this.toShow = this.toShow.add(label);
+		},
+		
+		errorsFor: function(element) {
+			return this.errors().filter("[for='" + this.idOrName(element) + "']");
+		},
+		
+		idOrName: function(element) {
+			return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);
+		},
+
+		checkable: function( element ) {
+			return /radio|checkbox/i.test(element.type);
+		},
+		
+		findByName: function( name ) {
+			// select by name and filter by form for performance over form.find("[name=...]")
+			var form = this.currentForm;
+			return $(document.getElementsByName(name)).map(function(index, element) {
+				return element.form == form && element.name == name && element  || null;
+			});
+		},
+		
+		getLength: function(value, element) {
+			switch( element.nodeName.toLowerCase() ) {
+			case 'select':
+				return $("option:selected", element).length;
+			case 'input':
+				if( this.checkable( element) )
+					return this.findByName(element.name).filter(':checked').length;
+			}
+			return value.length;
+		},
+	
+		depend: function(param, element) {
+			return this.dependTypes[typeof param]
+				? this.dependTypes[typeof param](param, element)
+				: true;
+		},
+	
+		dependTypes: {
+			"boolean": function(param, element) {
+				return param;
+			},
+			"string": function(param, element) {
+				return !!$(param, element.form).length;
+			},
+			"function": function(param, element) {
+				return param(element);
+			}
+		},
+		
+		optional: function(element) {
+			return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch";
+		},
+		
+		startRequest: function(element) {
+			if (!this.pending[element.name]) {
+				this.pendingRequest++;
+				this.pending[element.name] = true;
+			}
+		},
+		
+		stopRequest: function(element, valid) {
+			this.pendingRequest--;
+			// sometimes synchronization fails, make sure pendingRequest is never < 0
+			if (this.pendingRequest < 0)
+				this.pendingRequest = 0;
+			delete this.pending[element.name];
+			if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) {
+				$(this.currentForm).submit();
+			} else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {
+				$(this.currentForm).triggerHandler("invalid-form", [this]);
+			}
+		},
+		
+		previousValue: function(element) {
+			return $.data(element, "previousValue") || $.data(element, "previousValue", previous = {
+				old: null,
+				valid: true,
+				message: this.defaultMessage( element, "remote" )
+			});
+		}
+		
+	},
+	
+	classRuleSettings: {
+		required: {required: true},
+		email: {email: true},
+		url: {url: true},
+		date: {date: true},
+		dateISO: {dateISO: true},
+		dateDE: {dateDE: true},
+		number: {number: true},
+		numberDE: {numberDE: true},
+		digits: {digits: true},
+		creditcard: {creditcard: true}
+	},
+	
+	addClassRules: function(className, rules) {
+		className.constructor == String ?
+			this.classRuleSettings[className] = rules :
+			$.extend(this.classRuleSettings, className);
+	},
+	
+	classRules: function(element) {
+		var rules = {};
+		var classes = $(element).attr('class');
+		classes && $.each(classes.split(' '), function() {
+			if (this in $.validator.classRuleSettings) {
+				$.extend(rules, $.validator.classRuleSettings[this]);
+			}
+		});
+		return rules;
+	},
+	
+	attributeRules: function(element) {
+		var rules = {};
+		var $element = $(element);
+		
+		for (method in $.validator.methods) {
+			var value = $element.attr(method);
+			if (value) {
+				rules[method] = value;
+			}
+		}
+		
+		// maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs
+		if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {
+			delete rules.maxlength;
+		}
+		
+		return rules;
+	},
+	
+	metadataRules: function(element) {
+		if (!$.metadata) return {};
+		
+		var meta = $.data(element.form, 'validator').settings.meta;
+		return meta ?
+			$(element).metadata()[meta] :
+			$(element).metadata();
+	},
+	
+	staticRules: function(element) {
+		var rules = {};
+		var validator = $.data(element.form, 'validator');
+		if (validator.settings.rules) {
+			rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};
+		}
+		return rules;
+	},
+	
+	normalizeRules: function(rules, element) {
+		// handle dependency check
+		$.each(rules, function(prop, val) {
+			// ignore rule when param is explicitly false, eg. required:false
+			if (val === false) {
+				delete rules[prop];
+				return;
+			}
+			if (val.param || val.depends) {
+				var keepRule = true;
+				switch (typeof val.depends) {
+					case "string":
+						keepRule = !!$(val.depends, element.form).length;
+						break;
+					case "function":
+						keepRule = val.depends.call(element, element);
+						break;
+				}
+				if (keepRule) {
+					rules[prop] = val.param !== undefined ? val.param : true;
+				} else {
+					delete rules[prop];
+				}
+			}
+		});
+		
+		// evaluate parameters
+		$.each(rules, function(rule, parameter) {
+			rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;
+		});
+		
+		// clean number parameters
+		$.each(['minlength', 'maxlength', 'min', 'max'], function() {
+			if (rules[this]) {
+				rules[this] = Number(rules[this]);
+			}
+		});
+		$.each(['rangelength', 'range'], function() {
+			if (rules[this]) {
+				rules[this] = [Number(rules[this][0]), Number(rules[this][1])];
+			}
+		});
+		
+		if ($.validator.autoCreateRanges) {
+			// auto-create ranges
+			if (rules.min && rules.max) {
+				rules.range = [rules.min, rules.max];
+				delete rules.min;
+				delete rules.max;
+			}
+			if (rules.minlength && rules.maxlength) {
+				rules.rangelength = [rules.minlength, rules.maxlength];
+				delete rules.minlength;
+				delete rules.maxlength;
+			}
+		}
+		
+		// To support custom messages in metadata ignore rule methods titled "messages"
+		if (rules.messages) {
+			delete rules.messages
+		}
+		
+		return rules;
+	},
+	
+	// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
+	normalizeRule: function(data) {
+		if( typeof data == "string" ) {
+			var transformed = {};
+			$.each(data.split(/\s/), function() {
+				transformed[this] = true;
+			});
+			data = transformed;
+		}
+		return data;
+	},
+	
+	// http://docs.jquery.com/Plugins/Validation/Validator/addMethod
+	addMethod: function(name, method, message) {
+		$.validator.methods[name] = method;
+		$.validator.messages[name] = message || $.validator.messages[name];
+		if (method.length < 3) {
+			$.validator.addClassRules(name, $.validator.normalizeRule(name));
+		}
+	},
+
+	methods: {
+
+		// http://docs.jquery.com/Plugins/Validation/Methods/required
+		required: function(value, element, param) {
+			// check if dependency is met
+			if ( !this.depend(param, element) )
+				return "dependency-mismatch";
+			switch( element.nodeName.toLowerCase() ) {
+			case 'select':
+				var options = $("option:selected", element);
+				return options.length > 0 && ( element.type == "select-multiple" || ($.browser.msie && !(options[0].attributes['value'].specified) ? options[0].text : options[0].value).length > 0);
+			case 'input':
+				if ( this.checkable(element) )
+					return this.getLength(value, element) > 0;
+			default:
+				return $.trim(value).length > 0;
+			}
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/remote
+		remote: function(value, element, param) {
+			if ( this.optional(element) )
+				return "dependency-mismatch";
+			
+			var previous = this.previousValue(element);
+			
+			if (!this.settings.messages[element.name] )
+				this.settings.messages[element.name] = {};
+			this.settings.messages[element.name].remote = typeof previous.message == "function" ? previous.message(value) : previous.message;
+			
+			param = typeof param == "string" && {url:param} || param; 
+			
+			if ( previous.old !== value ) {
+				previous.old = value;
+				var validator = this;
+				this.startRequest(element);
+				var data = {};
+				data[element.name] = value;
+				$.ajax($.extend(true, {
+					url: param,
+					mode: "abort",
+					port: "validate" + element.name,
+					dataType: "json",
+					data: data,
+					success: function(response) {
+						var valid = response === true;
+						if ( valid ) {
+							var submitted = validator.formSubmitted;
+							validator.prepareElement(element);
+							validator.formSubmitted = submitted;
+							validator.successList.push(element);
+							validator.showErrors();
+						} else {
+							var errors = {};
+							errors[element.name] = previous.message = response || validator.defaultMessage( element, "remote" );
+							validator.showErrors(errors);
+						}
+						previous.valid = valid;
+						validator.stopRequest(element, valid);
+					}
+				}, param));
+				return "pending";
+			} else if( this.pending[element.name] ) {
+				return "pending";
+			}
+			return previous.valid;
+		},
+
+		// http://docs.jquery.com/Plugins/Validation/Methods/minlength
+		minlength: function(value, element, param) {
+			return this.optional(element) || this.getLength($.trim(value), element) >= param;
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/maxlength
+		maxlength: function(value, element, param) {
+			return this.optional(element) || this.getLength($.trim(value), element) <= param;
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/rangelength
+		rangelength: function(value, element, param) {
+			var length = this.getLength($.trim(value), element);
+			return this.optional(element) || ( length >= param[0] && length <= param[1] );
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/min
+		min: function( value, element, param ) {
+			return this.optional(element) || value >= param;
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/max
+		max: function( value, element, param ) {
+			return this.optional(element) || value <= param;
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/range
+		range: function( value, element, param ) {
+			return this.optional(element) || ( value >= param[0] && value <= param[1] );
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/email
+		email: function(value, element) {
+			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
+			return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
+		},
+	
+		// http://docs.jquery.com/Plugins/Validation/Methods/url
+		url: function(value, element) {
+			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
+			return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
+		},
+        
+		// http://docs.jquery.com/Plugins/Validation/Methods/date
+		date: function(value, element) {
+			return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
+		},
+	
+		// http://docs.jquery.com/Plugins/Validation/Methods/dateISO
+		dateISO: function(value, element) {
+			return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);
+		},
+	
+		// http://docs.jquery.com/Plugins/Validation/Methods/dateDE
+		dateDE: function(value, element) {
+			return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value);
+		},
+	
+		// http://docs.jquery.com/Plugins/Validation/Methods/number
+		number: function(value, element) {
+			return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
+		},
+	
+		// http://docs.jquery.com/Plugins/Validation/Methods/numberDE
+		numberDE: function(value, element) {
+			return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/digits
+		digits: function(value, element) {
+			return this.optional(element) || /^\d+$/.test(value);
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/creditcard
+		// based on http://en.wikipedia.org/wiki/Luhn
+		creditcard: function(value, element) {
+			if ( this.optional(element) )
+				return "dependency-mismatch";
+			// accept only digits and dashes
+			if (/[^0-9-]+/.test(value))
+				return false;
+			var nCheck = 0,
+				nDigit = 0,
+				bEven = false;
+
+			value = value.replace(/\D/g, "");
+
+			for (n = value.length - 1; n >= 0; n--) {
+				var cDigit = value.charAt(n);
+				var nDigit = parseInt(cDigit, 10);
+				if (bEven) {
+					if ((nDigit *= 2) > 9)
+						nDigit -= 9;
+				}
+				nCheck += nDigit;
+				bEven = !bEven;
+			}
+
+			return (nCheck % 10) == 0;
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/accept
+		accept: function(value, element, param) {
+			param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif";
+			return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); 
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/equalTo
+		equalTo: function(value, element, param) {
+			return value == $(param).val();
+		}
+		
+	}
+	
+});
+
+// deprecated, use $.validator.format instead
+$.format = $.validator.format;
+
+})(jQuery);
+
+// ajax mode: abort
+// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
+// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() 
+;(function($) {
+	var ajax = $.ajax;
+	var pendingRequests = {};
+	$.ajax = function(settings) {
+		// create settings for compatibility with ajaxSetup
+		settings = $.extend(settings, $.extend({}, $.ajaxSettings, settings));
+		var port = settings.port;
+		if (settings.mode == "abort") {
+			if ( pendingRequests[port] ) {
+				pendingRequests[port].abort();
+			}
+			return (pendingRequests[port] = ajax.apply(this, arguments));
+		}
+		return ajax.apply(this, arguments);
+	};
+})(jQuery);
+
+// provides cross-browser focusin and focusout events
+// IE has native support, in other browsers, use event caputuring (neither bubbles)
+
+// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
+// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target 
+
+// provides triggerEvent(type: String, target: Element) to trigger delegated events
+;(function($) {
+	$.each({
+		focus: 'focusin',
+		blur: 'focusout'	
+	}, function( original, fix ){
+		$.event.special[fix] = {
+			setup:function() {
+				if ( $.browser.msie ) return false;
+				this.addEventListener( original, $.event.special[fix].handler, true );
+			},
+			teardown:function() {
+				if ( $.browser.msie ) return false;
+				this.removeEventListener( original,
+				$.event.special[fix].handler, true );
+			},
+			handler: function(e) {
+				arguments[0] = $.event.fix(e);
+				arguments[0].type = fix;
+				return $.event.handle.apply(this, arguments);
+			}
+		};
+	});
+	$.extend($.fn, {
+		delegate: function(type, delegate, handler) {
+			return this.bind(type, function(event) {
+				var target = $(event.target);
+				if (target.is(delegate)) {
+					return handler.apply(target, arguments);
+				}
+			});
+		},
+		triggerEvent: function(type, target) {
+			return this.triggerHandler(type, [$.event.fix({ type: type, target: target })]);
+		}
+	})
+})(jQuery);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/ldt/js/login_ajax/jquery.login.js	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,77 @@
+$(document).ready(function() {
+     $('#password').keypress(function(e) {
+            if(e.which == 13) {
+                jQuery('#submit').focus().click();
+            }
+        });
+
+
+    $("#submit").click(function() {
+        var username=$("#username").val();
+        var password=$("#password").val();
+        var data = {'username': username, 'password': password, 'reload': reload};
+        if(username=="" && password=="")
+        {
+            $("#login_form_username_error").show();
+            $("#login_form_password_error").show();
+            $("#username").addClass("ajaxform_invalid");
+            $("#password").addClass("ajaxform_invalid");
+        }
+        else if(username=="" && password!="")
+        {
+            $("#login_form_username_error").show();
+            $("#username").addClass("ajaxform_invalid");
+        }
+        else if(password=="" && username!="")
+        {
+            $("#login_form_password_error").show();
+            $("#password").addClass("ajaxform_invalid");
+        }
+        else{
+    
+        $.ajax({
+        type: "POST",  
+        url : url_login_ajax,
+        dataType:'json',
+        data: data,
+        error: function (){
+            $("#msg").html("fail to connect");
+            },
+        success: function(data, reload){ //if success, refrash un bout de page pour afficher le nom de utilisateur et déconnecter.
+                            if (data.message!="successful")
+                            {
+                                $("#msg").html(data.message).show();
+                            }
+                            else{
+                            // $("#floatdialog_mask_loginform").hide();
+                            //window.location.reload();
+                                if (data.reload=='true'){
+                                    window.location.reload();
+                                }
+                                else{
+                                    //$("#loginstate").html('<a href ="'+url_userspace+'">'+data.username+'</a> | <a href="'+url_logout+'">déconnection</a>');
+                                    //$("#loginstate").html('<ul class="usertool"><li id="user">'+data.username+'</li><li><a href ="'+url_userprofile+'">Profiles</a></li><li><a href ="'+url_userspace+'">Space</a></li><li><a href="'+url_logout+'">déconnection</a></li></ul>');
+                                    var $DOMWindowOverlay = $('#DOMWindowOverlay');
+                                    var $DOMWindow = $('#DOMWindow');
+                                    $DOMWindowOverlay.fadeOut('fast',function(){
+                                        $DOMWindowOverlay.trigger('unload').unbind().remove();																	  
+                                    });
+                                    $DOMWindow.fadeOut('fast',function(){
+                                        if($.fn.draggable){
+                                            $DOMWindow.draggable("destroy").trigger("unload").remove();
+                                        }else{
+                                            $DOMWindow.trigger("unload").remove();
+                                        }
+                                    });
+                                    $("#loginstate").html(data.html);
+                                }
+                            }
+                         
+                           
+                }  
+        });
+        }
+    });
+})
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/ldt/js/login_ajax/login_ajax.css	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,75 @@
+#loginform
+{
+    font-size: 16px;
+    background: #ffffff scroll repeat 0 0;
+    /*border: 2px solid #666666;*/
+    text-align: left;
+    /*width: 400px;*/
+}
+
+#loginform .title
+{
+    color: #FFFFFF;
+    background: #990000 scroll repeat left top;
+    font-weight:bold;
+    height:34px;
+    position: relative;
+    line-height: 34px;
+    overflow: hidden;
+    text-transform: uppercase;
+}
+
+#loginform .title div
+{
+    font-size: 16px;
+    margin-left:12px;
+}
+
+#loginform .title .closeDOMWindow
+{
+    float: right;
+    text-decoration: none;
+    color:#ffffff;
+    padding-right:2px;
+}
+
+#loginform .ajaxform_invalid{
+    background: #ffdddd none repeat scroll 0 0;
+}
+
+#loginform .ajaxform_error{
+    display: none;
+    color:red;
+    font-size: 11px;
+    line-height: 13px;
+}
+
+#loginform #msg{
+    display:none;
+    background:#FBE3E4 none repeat scroll 0 0;
+    color: red;
+    padding:0.5em;
+    border-color:#FBC2C4;
+    font-size: 13px;
+    font-weight:bold;
+}
+
+#loginform dl {
+    font-size:13px;
+    line-height:22px;
+}
+
+#loginform dl dt{
+    clear:left;
+    color:#666666;
+    float:left;
+    font-weight:bold;
+    width:100px
+}
+
+#loginform dl dd {
+    margin-left: 110px;
+    padding-bottom: 8px;
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/ldt/js/swfobject.js	Thu Jun 10 19:19:13 2010 +0200
@@ -0,0 +1,5 @@
+/* SWFObject v2.1 <http://code.google.com/p/swfobject/>
+	Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis
+	This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
+*/
+var swfobject=function(){var b="undefined",Q="object",n="Shockwave Flash",p="ShockwaveFlash.ShockwaveFlash",P="application/x-shockwave-flash",m="SWFObjectExprInst",j=window,K=document,T=navigator,o=[],N=[],i=[],d=[],J,Z=null,M=null,l=null,e=false,A=false;var h=function(){var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,AC=[0,0,0],x=null;if(typeof T.plugins!=b&&typeof T.plugins[n]==Q){x=T.plugins[n].description;if(x&&!(typeof T.mimeTypes!=b&&T.mimeTypes[P]&&!T.mimeTypes[P].enabledPlugin)){x=x.replace(/^.*\s+(\S+\s+\S+$)/,"$1");AC[0]=parseInt(x.replace(/^(.*)\..*$/,"$1"),10);AC[1]=parseInt(x.replace(/^.*\.(.*)\s.*$/,"$1"),10);AC[2]=/r/.test(x)?parseInt(x.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof j.ActiveXObject!=b){var y=null,AB=false;try{y=new ActiveXObject(p+".7")}catch(t){try{y=new ActiveXObject(p+".6");AC=[6,0,21];y.AllowScriptAccess="always"}catch(t){if(AC[0]==6){AB=true}}if(!AB){try{y=new ActiveXObject(p)}catch(t){}}}if(!AB&&y){try{x=y.GetVariable("$version");if(x){x=x.split(" ")[1].split(",");AC=[parseInt(x[0],10),parseInt(x[1],10),parseInt(x[2],10)]}}catch(t){}}}}var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,q=false,z=r?/win/.test(r):/win/.test(AD),w=r?/mac/.test(r):/mac/.test(AD);/*@cc_on q=true;@if(@_win32)z=true;@elif(@_mac)w=true;@end@*/return{w3cdom:v,pv:AC,webkit:AA,ie:q,win:z,mac:w}}();var L=function(){if(!h.w3cdom){return }f(H);if(h.ie&&h.win){try{K.write("<script id=__ie_ondomload defer=true src=//:><\/script>");J=C("__ie_ondomload");if(J){I(J,"onreadystatechange",S)}}catch(q){}}if(h.webkit&&typeof K.readyState!=b){Z=setInterval(function(){if(/loaded|complete/.test(K.readyState)){E()}},10)}if(typeof K.addEventListener!=b){K.addEventListener("DOMContentLoaded",E,null)}R(E)}();function S(){if(J.readyState=="complete"){J.parentNode.removeChild(J);E()}}function E(){if(e){return }if(h.ie&&h.win){var v=a("span");try{var u=K.getElementsByTagName("body")[0].appendChild(v);u.parentNode.removeChild(u)}catch(w){return }}e=true;if(Z){clearInterval(Z);Z=null}var q=o.length;for(var r=0;r<q;r++){o[r]()}}function f(q){if(e){q()}else{o[o.length]=q}}function R(r){if(typeof j.addEventListener!=b){j.addEventListener("load",r,false)}else{if(typeof K.addEventListener!=b){K.addEventListener("load",r,false)}else{if(typeof j.attachEvent!=b){I(j,"onload",r)}else{if(typeof j.onload=="function"){var q=j.onload;j.onload=function(){q();r()}}else{j.onload=r}}}}}function H(){var t=N.length;for(var q=0;q<t;q++){var u=N[q].id;if(h.pv[0]>0){var r=C(u);if(r){N[q].width=r.getAttribute("width")?r.getAttribute("width"):"0";N[q].height=r.getAttribute("height")?r.getAttribute("height"):"0";if(c(N[q].swfVersion)){if(h.webkit&&h.webkit<312){Y(r)}W(u,true)}else{if(N[q].expressInstall&&!A&&c("6.0.65")&&(h.win||h.mac)){k(N[q])}else{O(r)}}}}else{W(u,true)}}}function Y(t){var q=t.getElementsByTagName(Q)[0];if(q){var w=a("embed"),y=q.attributes;if(y){var v=y.length;for(var u=0;u<v;u++){if(y[u].nodeName=="DATA"){w.setAttribute("src",y[u].nodeValue)}else{w.setAttribute(y[u].nodeName,y[u].nodeValue)}}}var x=q.childNodes;if(x){var z=x.length;for(var r=0;r<z;r++){if(x[r].nodeType==1&&x[r].nodeName=="PARAM"){w.setAttribute(x[r].getAttribute("name"),x[r].getAttribute("value"))}}}t.parentNode.replaceChild(w,t)}}function k(w){A=true;var u=C(w.id);if(u){if(w.altContentId){var y=C(w.altContentId);if(y){M=y;l=w.altContentId}}else{M=G(u)}if(!(/%$/.test(w.width))&&parseInt(w.width,10)<310){w.width="310"}if(!(/%$/.test(w.height))&&parseInt(w.height,10)<137){w.height="137"}K.title=K.title.slice(0,47)+" - Flash Player Installation";var z=h.ie&&h.win?"ActiveX":"PlugIn",q=K.title,r="MMredirectURL="+j.location+"&MMplayerType="+z+"&MMdoctitle="+q,x=w.id;if(h.ie&&h.win&&u.readyState!=4){var t=a("div");x+="SWFObjectNew";t.setAttribute("id",x);u.parentNode.insertBefore(t,u);u.style.display="none";var v=function(){u.parentNode.removeChild(u)};I(j,"onload",v)}U({data:w.expressInstall,id:m,width:w.width,height:w.height},{flashvars:r},x)}}function O(t){if(h.ie&&h.win&&t.readyState!=4){var r=a("div");t.parentNode.insertBefore(r,t);r.parentNode.replaceChild(G(t),r);t.style.display="none";var q=function(){t.parentNode.removeChild(t)};I(j,"onload",q)}else{t.parentNode.replaceChild(G(t),t)}}function G(v){var u=a("div");if(h.win&&h.ie){u.innerHTML=v.innerHTML}else{var r=v.getElementsByTagName(Q)[0];if(r){var w=r.childNodes;if(w){var q=w.length;for(var t=0;t<q;t++){if(!(w[t].nodeType==1&&w[t].nodeName=="PARAM")&&!(w[t].nodeType==8)){u.appendChild(w[t].cloneNode(true))}}}}}return u}function U(AG,AE,t){var q,v=C(t);if(v){if(typeof AG.id==b){AG.id=t}if(h.ie&&h.win){var AF="";for(var AB in AG){if(AG[AB]!=Object.prototype[AB]){if(AB.toLowerCase()=="data"){AE.movie=AG[AB]}else{if(AB.toLowerCase()=="styleclass"){AF+=' class="'+AG[AB]+'"'}else{if(AB.toLowerCase()!="classid"){AF+=" "+AB+'="'+AG[AB]+'"'}}}}}var AD="";for(var AA in AE){if(AE[AA]!=Object.prototype[AA]){AD+='<param name="'+AA+'" value="'+AE[AA]+'" />'}}v.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+AF+">"+AD+"</object>";i[i.length]=AG.id;q=C(AG.id)}else{if(h.webkit&&h.webkit<312){var AC=a("embed");AC.setAttribute("type",P);for(var z in AG){if(AG[z]!=Object.prototype[z]){if(z.toLowerCase()=="data"){AC.setAttribute("src",AG[z])}else{if(z.toLowerCase()=="styleclass"){AC.setAttribute("class",AG[z])}else{if(z.toLowerCase()!="classid"){AC.setAttribute(z,AG[z])}}}}}for(var y in AE){if(AE[y]!=Object.prototype[y]){if(y.toLowerCase()!="movie"){AC.setAttribute(y,AE[y])}}}v.parentNode.replaceChild(AC,v);q=AC}else{var u=a(Q);u.setAttribute("type",P);for(var x in AG){if(AG[x]!=Object.prototype[x]){if(x.toLowerCase()=="styleclass"){u.setAttribute("class",AG[x])}else{if(x.toLowerCase()!="classid"){u.setAttribute(x,AG[x])}}}}for(var w in AE){if(AE[w]!=Object.prototype[w]&&w.toLowerCase()!="movie"){F(u,w,AE[w])}}v.parentNode.replaceChild(u,v);q=u}}}return q}function F(t,q,r){var u=a("param");u.setAttribute("name",q);u.setAttribute("value",r);t.appendChild(u)}function X(r){var q=C(r);if(q&&(q.nodeName=="OBJECT"||q.nodeName=="EMBED")){if(h.ie&&h.win){if(q.readyState==4){B(r)}else{j.attachEvent("onload",function(){B(r)})}}else{q.parentNode.removeChild(q)}}}function B(t){var r=C(t);if(r){for(var q in r){if(typeof r[q]=="function"){r[q]=null}}r.parentNode.removeChild(r)}}function C(t){var q=null;try{q=K.getElementById(t)}catch(r){}return q}function a(q){return K.createElement(q)}function I(t,q,r){t.attachEvent(q,r);d[d.length]=[t,q,r]}function c(t){var r=h.pv,q=t.split(".");q[0]=parseInt(q[0],10);q[1]=parseInt(q[1],10)||0;q[2]=parseInt(q[2],10)||0;return(r[0]>q[0]||(r[0]==q[0]&&r[1]>q[1])||(r[0]==q[0]&&r[1]==q[1]&&r[2]>=q[2]))?true:false}function V(v,r){if(h.ie&&h.mac){return }var u=K.getElementsByTagName("head")[0],t=a("style");t.setAttribute("type","text/css");t.setAttribute("media","screen");if(!(h.ie&&h.win)&&typeof K.createTextNode!=b){t.appendChild(K.createTextNode(v+" {"+r+"}"))}u.appendChild(t);if(h.ie&&h.win&&typeof K.styleSheets!=b&&K.styleSheets.length>0){var q=K.styleSheets[K.styleSheets.length-1];if(typeof q.addRule==Q){q.addRule(v,r)}}}function W(t,q){var r=q?"visible":"hidden";if(e&&C(t)){C(t).style.visibility=r}else{V("#"+t,"visibility:"+r)}}function g(s){var r=/[\\\"<>\.;]/;var q=r.exec(s)!=null;return q?encodeURIComponent(s):s}var D=function(){if(h.ie&&h.win){window.attachEvent("onunload",function(){var w=d.length;for(var v=0;v<w;v++){d[v][0].detachEvent(d[v][1],d[v][2])}var t=i.length;for(var u=0;u<t;u++){X(i[u])}for(var r in h){h[r]=null}h=null;for(var q in swfobject){swfobject[q]=null}swfobject=null})}}();return{registerObject:function(u,q,t){if(!h.w3cdom||!u||!q){return }var r={};r.id=u;r.swfVersion=q;r.expressInstall=t?t:false;N[N.length]=r;W(u,false)},getObjectById:function(v){var q=null;if(h.w3cdom){var t=C(v);if(t){var u=t.getElementsByTagName(Q)[0];if(!u||(u&&typeof t.SetVariable!=b)){q=t}else{if(typeof u.SetVariable!=b){q=u}}}}return q},embedSWF:function(x,AE,AB,AD,q,w,r,z,AC){if(!h.w3cdom||!x||!AE||!AB||!AD||!q){return }AB+="";AD+="";if(c(q)){W(AE,false);var AA={};if(AC&&typeof AC===Q){for(var v in AC){if(AC[v]!=Object.prototype[v]){AA[v]=AC[v]}}}AA.data=x;AA.width=AB;AA.height=AD;var y={};if(z&&typeof z===Q){for(var u in z){if(z[u]!=Object.prototype[u]){y[u]=z[u]}}}if(r&&typeof r===Q){for(var t in r){if(r[t]!=Object.prototype[t]){if(typeof y.flashvars!=b){y.flashvars+="&"+t+"="+r[t]}else{y.flashvars=t+"="+r[t]}}}}f(function(){U(AA,y,AE);if(AA.id==AE){W(AE,true)}})}else{if(w&&!A&&c("6.0.65")&&(h.win||h.mac)){A=true;W(AE,false);f(function(){var AF={};AF.id=AF.altContentId=AE;AF.width=AB;AF.height=AD;AF.expressInstall=w;k(AF)})}}},getFlashPlayerVersion:function(){return{major:h.pv[0],minor:h.pv[1],release:h.pv[2]}},hasFlashPlayerVersion:c,createSWF:function(t,r,q){if(h.w3cdom){return U(t,r,q)}else{return undefined}},removeSWF:function(q){if(h.w3cdom){X(q)}},createCSS:function(r,q){if(h.w3cdom){V(r,q)}},addDomLoadEvent:f,addLoadEvent:R,getQueryParamValue:function(v){var u=K.location.search||K.location.hash;if(v==null){return g(u)}if(u){var t=u.substring(1).split("&");for(var r=0;r<t.length;r++){if(t[r].substring(0,t[r].indexOf("="))==v){return g(t[r].substring((t[r].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(A&&M){var q=C(m);if(q){q.parentNode.replaceChild(M,q);if(l){W(l,true);if(h.ie&&h.win){M.style.display="block"}}M=null;l=null;A=false}}}}}();
\ No newline at end of file