[cig-commits] r11498 - in cs/portal/trunk/seismo/SeismoWebPortal: . designs designs/plone static/css templates templates/SeismoWebPortal templates/registration

leif at geodynamics.org leif at geodynamics.org
Fri Mar 21 20:37:05 PDT 2008


Author: leif
Date: 2008-03-21 20:37:05 -0700 (Fri, 21 Mar 2008)
New Revision: 11498

Added:
   cs/portal/trunk/seismo/SeismoWebPortal/designs/
   cs/portal/trunk/seismo/SeismoWebPortal/designs/__init__.py
   cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/
   cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.html
   cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.py
   cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Document.html
   cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Document.py
   cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.html
   cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.py
   cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/__init__.py
   cs/portal/trunk/seismo/SeismoWebPortal/gui.py
   cs/portal/trunk/seismo/SeismoWebPortal/list_detail.py
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/user_map.html
Removed:
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/base.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/events.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/objects.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/root.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/settings.html
Modified:
   cs/portal/trunk/seismo/SeismoWebPortal/create_update.py
   cs/portal/trunk/seismo/SeismoWebPortal/static/css/style.css
   cs/portal/trunk/seismo/SeismoWebPortal/templates/404.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/500.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_confirm_delete.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_list.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_search.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_search_results.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/home.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mesh_confirm_delete.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mesh_form_base.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/model_confirm_delete.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/model_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/object_lists.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/password_change_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/register.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/registration_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/single_source_event_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/source_confirm_delete.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/source_detail.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/source_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_confirm_delete.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_detail.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/splash.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_confirm_delete.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_detail.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/userinfo_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/registration/login.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/registration/pwreset.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/registration/pwreset_done.html
   cs/portal/trunk/seismo/SeismoWebPortal/views.py
Log:
Preemptively made the portal pretty by linking to Plone's stylesheets
on the main site.


Modified: cs/portal/trunk/seismo/SeismoWebPortal/create_update.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/create_update.py	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/create_update.py	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,4 +1,3 @@
-from django.core.xheaders import populate_xheaders
 from django.template import loader
 from django import forms
 from django.db.models import FileField
@@ -6,13 +5,14 @@
 from django.template import RequestContext
 from django.http import Http404, HttpResponse, HttpResponseRedirect
 from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured
+import gui
 
 def noop(*args, **kwds):
     pass
 
-def create_object(request, model, template_name=None,
+def create_object(request, desktop, window, model, template_name=None,
                   template_loader=loader, extra_context=None, post_save_redirect=None,
-                  login_required=False, follow=None, context_processors=None,
+                  login_required=False, follow=None,
                   post_save_hook=noop):
     """
     Generic object-creation function.
@@ -77,19 +77,21 @@
     if not template_name:
         template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower())
     t = template_loader.get_template(template_name)
-    c = RequestContext(request, {
+    c = {
         'form': form,
         'help_visible': help_visible,
         'action': request.path,
-    }, context_processors)
+    }
     for key, value in extra_context.items():
         if callable(value):
             c[key] = value()
         else:
             c[key] = value
-    return HttpResponse(t.render(c))
+    window.content = gui.StaticContent(t.render(c))
+    desktop.activeWindow.selectWindow(window)
+    return desktop
 
-def update_object(request, model, object_id=None, slug=None,
+def update_object(request, desktop, window, model, object_id=None, slug=None,
                   slug_field=None, template_name=None, template_loader=loader,
                   extra_context=None, post_save_redirect=None,
                   login_required=False, follow=None, context_processors=None,
@@ -177,11 +179,12 @@
             c[key] = value()
         else:
             c[key] = value
-    response = HttpResponse(t.render(c))
-    populate_xheaders(request, response, model, getattr(object, object._meta.pk.name))
-    return response
+    window.content = gui.StaticContent(t.render(c))
+    desktop.activeWindow.selectWindow(window)
+    return desktop
 
-def delete_object(request, model, post_delete_redirect,
+
+def delete_object(request, desktop, model, post_delete_redirect,
         object_id=None, slug=None, slug_field=None, template_name=None,
         template_loader=loader, extra_context=None,
         login_required=False, context_processors=None, template_object_name='object'):
@@ -231,6 +234,8 @@
                 c[key] = value()
             else:
                 c[key] = value
-        response = HttpResponse(t.render(c))
-        populate_xheaders(request, response, model, getattr(object, object._meta.pk.name))
-        return response
+
+        child = gui.ChildWindow(request.path, "Delete")
+        child.content = gui.StaticContent(t.render(c))
+        desktop.activeWindow.selectWindow(child)
+        return desktop

Added: cs/portal/trunk/seismo/SeismoWebPortal/designs/__init__.py
===================================================================

Added: cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.html	                        (rev 0)
+++ cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -0,0 +1,69 @@
+
+<h1 id="portal-logo">
+    <a href="$root/" accesskey="1">$desktop.title</a>
+</h1>
+
+<ul id="portal-globalnav">
+    #for $window in $desktop.windowList
+        #set $klass = $window is $desktop.activeWindow and "selected" or "plain"
+        <li class="$klass"><a href="$window.url">$window.title</a></li>
+    #end for
+</ul>
+
+<div id="portal-personaltools-wrapper"><ul id="portal-personaltools">
+    #if $desktop.user
+        <li class="portalUser">
+            <!--<a id="user-name" href="">-->
+                <span class="visualCaseSensitive">$desktop.user.first_name ($desktop.user.username)</span>
+            <!--</a>-->
+        </li>
+   
+        <li>
+            <a href="$root/profile/">
+                Profile
+            </a>
+        </li>
+    
+        <li>
+            <a href="$root/logout/">
+                Log out
+            </a>
+        </li>
+    #else
+        <li>
+            <a href="$root/login/">
+               Log in
+            </a>
+        </li>
+    #end if
+
+<!--
+        <li>
+        <dl class="actionMenu" id="statusMenu">
+          <dt class="actionMenuHeader">
+            <a href="http://www.geodynamics.org/cig/workinggroups/content_status_history"
+               title="Change the state of this item">
+                <span>text size</span>
+            </a>
+          </dt>
+          <dd class="actionMenuContent">
+
+
+    <ul>
+        <li><a href="javascript:setActiveStyleSheet('Large Text', 1);"
+               title="Large Text">Large</a></li>
+
+        <li><a href="javascript:setActiveStyleSheet('',1);"
+               title="Normal Text">Normal</a></li>
+        <li><a href="javascript:setActiveStyleSheet('Small Text',1);"
+               title="Small Text">Small</a></li>
+    </ul>
+          </dd>
+        </dl>
+        </li>
+-->
+
+</ul></div>
+
+
+$activeWindow

Added: cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.py	                        (rev 0)
+++ cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.py	2008-03-22 03:37:05 UTC (rev 11498)
@@ -0,0 +1,228 @@
+#!/usr/bin/env python
+
+
+
+
+##################################################
+## DEPENDENCIES
+import sys
+import os
+import os.path
+from os.path import getmtime, exists
+import time
+import types
+import __builtin__
+from Cheetah.Version import MinCompatibleVersion as RequiredCheetahVersion
+from Cheetah.Version import MinCompatibleVersionTuple as RequiredCheetahVersionTuple
+from Cheetah.Template import Template
+from Cheetah.DummyTransaction import DummyTransaction
+from Cheetah.NameMapper import NotFound, valueForName, valueFromSearchList, valueFromFrameOrSearchList
+from Cheetah.CacheRegion import CacheRegion
+import Cheetah.Filters as Filters
+import Cheetah.ErrorCatchers as ErrorCatchers
+
+##################################################
+## MODULE CONSTANTS
+try:
+    True, False
+except NameError:
+    True, False = (1==1), (1==0)
+VFFSL=valueFromFrameOrSearchList
+VFSL=valueFromSearchList
+VFN=valueForName
+currentTime=time.time
+__CHEETAH_version__ = '2.0rc7'
+__CHEETAH_versionTuple__ = (2, 0, 0, 'candidate', 7)
+__CHEETAH_genTime__ = 1206060692.7349739
+__CHEETAH_genTimestamp__ = 'Thu Mar 20 17:51:32 2008'
+__CHEETAH_src__ = 'Desktop.html'
+__CHEETAH_srcLastModified__ = 'Thu Mar 20 17:34:07 2008'
+__CHEETAH_docstring__ = 'Autogenerated by CHEETAH: The Python-Powered Template Engine'
+
+if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple:
+    raise AssertionError(
+      'This template was compiled with Cheetah version'
+      ' %s. Templates compiled before version %s must be recompiled.'%(
+         __CHEETAH_version__, RequiredCheetahVersion))
+
+##################################################
+## CLASSES
+
+class Desktop(Template):
+
+    ##################################################
+    ## CHEETAH GENERATED METHODS
+
+
+    def __init__(self, *args, **KWs):
+
+        Template.__init__(self, *args, **KWs)
+        if not self._CHEETAH__instanceInitialized:
+            cheetahKWArgs = {}
+            allowedKWs = 'searchList namespaces filter filtersLib errorCatcher'.split()
+            for k,v in KWs.items():
+                if k in allowedKWs: cheetahKWArgs[k] = v
+            self._initCheetahInstance(**cheetahKWArgs)
+        
+
+    def respond(self, trans=None):
+
+
+
+        ## CHEETAH: main method generated for this template
+        if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
+            trans = self.transaction # is None unless self.awake() was called
+        if not trans:
+            trans = DummyTransaction()
+            _dummyTrans = True
+        else: _dummyTrans = False
+        write = trans.response().write
+        SL = self._CHEETAH__searchList
+        _filter = self._CHEETAH__currentFilter
+        
+        ########################################
+        ## START - generated method body
+        
+        write('\n<h1 id="portal-logo">\n    <a href="')
+        _v = VFFSL(SL,"root",True) # '$root' on line 3, col 14
+        if _v is not None: write(_filter(_v, rawExpr='$root')) # from line 3, col 14.
+        write('/" accesskey="1">')
+        _v = VFFSL(SL,"desktop.title",True) # '$desktop.title' on line 3, col 36
+        if _v is not None: write(_filter(_v, rawExpr='$desktop.title')) # from line 3, col 36.
+        write('''</a>
+</h1>
+
+<ul id="portal-globalnav">
+''')
+        for window in VFFSL(SL,"desktop.windowList",True): # generated from line 7, col 5
+            klass = VFFSL(SL,"window",True) is VFFSL(SL,"desktop.activeWindow",True) and "selected" or "plain"
+            write('        <li class="')
+            _v = VFFSL(SL,"klass",True) # '$klass' on line 9, col 20
+            if _v is not None: write(_filter(_v, rawExpr='$klass')) # from line 9, col 20.
+            write('"><a href="')
+            _v = VFFSL(SL,"window.url",True) # '$window.url' on line 9, col 37
+            if _v is not None: write(_filter(_v, rawExpr='$window.url')) # from line 9, col 37.
+            write('">')
+            _v = VFFSL(SL,"window.title",True) # '$window.title' on line 9, col 50
+            if _v is not None: write(_filter(_v, rawExpr='$window.title')) # from line 9, col 50.
+            write('</a></li>\n')
+        write('''</ul>
+
+<div id="portal-personaltools-wrapper"><ul id="portal-personaltools">
+''')
+        if VFFSL(SL,"desktop.user",True): # generated from line 14, col 5
+            write('        <li class="portalUser">\n            <!--<a id="user-name" href="">-->\n                <span class="visualCaseSensitive">')
+            _v = VFFSL(SL,"desktop.user.first_name",True) # '$desktop.user.first_name' on line 17, col 51
+            if _v is not None: write(_filter(_v, rawExpr='$desktop.user.first_name')) # from line 17, col 51.
+            write(' (')
+            _v = VFFSL(SL,"desktop.user.username",True) # '$desktop.user.username' on line 17, col 77
+            if _v is not None: write(_filter(_v, rawExpr='$desktop.user.username')) # from line 17, col 77.
+            write(''')</span>
+            <!--</a>-->
+        </li>
+   
+        <li>
+            <a href="''')
+            _v = VFFSL(SL,"root",True) # '$root' on line 22, col 22
+            if _v is not None: write(_filter(_v, rawExpr='$root')) # from line 22, col 22.
+            write('''/profile/">
+                Profile
+            </a>
+        </li>
+    
+        <li>
+            <a href="''')
+            _v = VFFSL(SL,"root",True) # '$root' on line 28, col 22
+            if _v is not None: write(_filter(_v, rawExpr='$root')) # from line 28, col 22.
+            write('''/logout/">
+                Log out
+            </a>
+        </li>
+''')
+        else: # generated from line 32, col 5
+            write('        <li>\n            <a href="')
+            _v = VFFSL(SL,"root",True) # '$root' on line 34, col 22
+            if _v is not None: write(_filter(_v, rawExpr='$root')) # from line 34, col 22.
+            write('''/login/">
+               Log in
+            </a>
+        </li>
+''')
+        write('''
+<!--
+        <li>
+        <dl class="actionMenu" id="statusMenu">
+          <dt class="actionMenuHeader">
+            <a href="http://www.geodynamics.org/cig/workinggroups/content_status_history"
+               title="Change the state of this item">
+                <span>text size</span>
+            </a>
+          </dt>
+          <dd class="actionMenuContent">
+
+
+    <ul>
+        <li><a href="javascript:setActiveStyleSheet('Large Text', 1);"
+               title="Large Text">Large</a></li>
+
+        <li><a href="javascript:setActiveStyleSheet('',1);"
+               title="Normal Text">Normal</a></li>
+        <li><a href="javascript:setActiveStyleSheet('Small Text',1);"
+               title="Small Text">Small</a></li>
+    </ul>
+          </dd>
+        </dl>
+        </li>
+-->
+
+</ul></div>
+
+
+''')
+        _v = VFFSL(SL,"activeWindow",True) # '$activeWindow' on line 69, col 1
+        if _v is not None: write(_filter(_v, rawExpr='$activeWindow')) # from line 69, col 1.
+        write('\n')
+        
+        ########################################
+        ## END - generated method body
+        
+        return _dummyTrans and trans.response().getvalue() or ""
+        
+    ##################################################
+    ## CHEETAH GENERATED ATTRIBUTES
+
+
+    _CHEETAH__instanceInitialized = False
+
+    _CHEETAH_version = __CHEETAH_version__
+
+    _CHEETAH_versionTuple = __CHEETAH_versionTuple__
+
+    _CHEETAH_genTime = __CHEETAH_genTime__
+
+    _CHEETAH_genTimestamp = __CHEETAH_genTimestamp__
+
+    _CHEETAH_src = __CHEETAH_src__
+
+    _CHEETAH_srcLastModified = __CHEETAH_srcLastModified__
+
+    _mainCheetahMethod_for_Desktop= 'respond'
+
+## END CLASS DEFINITION
+
+if not hasattr(Desktop, '_initCheetahAttributes'):
+    templateAPIClass = getattr(Desktop, '_CHEETAH_templateClass', Template)
+    templateAPIClass._addCheetahPlumbingCodeToClass(Desktop)
+
+
+# CHEETAH was developed by Tavis Rudd and Mike Orr
+# with code, advice and input from many other volunteers.
+# For more information visit http://www.CheetahTemplate.org/
+
+##################################################
+## if run from command line:
+if __name__ == '__main__':
+    from Cheetah.TemplateCmdLineIface import CmdLineIface
+    CmdLineIface(templateObj=Desktop()).run()
+
+

Added: cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Document.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Document.html	                        (rev 0)
+++ cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Document.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -0,0 +1,27 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+    <script type="text/javascript" src="http://www.geodynamics.org/cig/portal_javascripts/Plone%20Default/ploneScripts3133.js"></script>
+    <script type="text/javascript" src="http://www.geodynamics.org/cig/portal_javascripts/Plone%20Default/ploneScripts1044.js"></script>
+    <style type="text/css"><!-- @import url(http://www.geodynamics.org/cig/portal_css/Plone%20Default/ploneStyles8697.css); --></style>
+    <style type="text/css" media="screen"><!-- @import url(http://www.geodynamics.org/cig/portal_css/Plone%20Default/ploneStyles4087.css); --></style>
+    <link rel="alternate stylesheet"
+          type="text/css" media="screen"
+          href="http://www.geodynamics.org/cig/portal_css/Plone%20Default/ploneStyles6585.css"
+          title="Small Text" />
+    <link rel="alternate stylesheet"
+          type="text/css" media="screen"
+          href="http://www.geodynamics.org/cig/portal_css/Plone%20Default/ploneStyles8555.css"
+          title="Large Text" />
+    <style type="text/css" media="all"><!-- @import url(http://www.geodynamics.org/cig/portal_css/Plone%20Default/ploneStyles5479.css); --></style>
+    <!-- Internet Explorer CSS Fixes -->
+    <!--[if lt IE 7]>
+        <style type="text/css" media="all">@import url(http://www.geodynamics.org/cig/IEFixes.css);</style>
+    <![endif]-->
+    <link href="/specfem3dglobe/css/style.css" type="text/css" rel="stylesheet" media="all" />
+    <title>$title</title>
+</head>
+<body>
+    $body
+</body>
+</html>

Added: cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Document.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Document.py	                        (rev 0)
+++ cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Document.py	2008-03-22 03:37:05 UTC (rev 11498)
@@ -0,0 +1,163 @@
+#!/usr/bin/env python
+
+
+
+
+##################################################
+## DEPENDENCIES
+import sys
+import os
+import os.path
+from os.path import getmtime, exists
+import time
+import types
+import __builtin__
+from Cheetah.Version import MinCompatibleVersion as RequiredCheetahVersion
+from Cheetah.Version import MinCompatibleVersionTuple as RequiredCheetahVersionTuple
+from Cheetah.Template import Template
+from Cheetah.DummyTransaction import DummyTransaction
+from Cheetah.NameMapper import NotFound, valueForName, valueFromSearchList, valueFromFrameOrSearchList
+from Cheetah.CacheRegion import CacheRegion
+import Cheetah.Filters as Filters
+import Cheetah.ErrorCatchers as ErrorCatchers
+
+##################################################
+## MODULE CONSTANTS
+try:
+    True, False
+except NameError:
+    True, False = (1==1), (1==0)
+VFFSL=valueFromFrameOrSearchList
+VFSL=valueFromSearchList
+VFN=valueForName
+currentTime=time.time
+__CHEETAH_version__ = '2.0rc7'
+__CHEETAH_versionTuple__ = (2, 0, 0, 'candidate', 7)
+__CHEETAH_genTime__ = 1206064108.9756939
+__CHEETAH_genTimestamp__ = 'Thu Mar 20 18:48:28 2008'
+__CHEETAH_src__ = 'Document.html'
+__CHEETAH_srcLastModified__ = 'Thu Mar 20 18:47:45 2008'
+__CHEETAH_docstring__ = 'Autogenerated by CHEETAH: The Python-Powered Template Engine'
+
+if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple:
+    raise AssertionError(
+      'This template was compiled with Cheetah version'
+      ' %s. Templates compiled before version %s must be recompiled.'%(
+         __CHEETAH_version__, RequiredCheetahVersion))
+
+##################################################
+## CLASSES
+
+class Document(Template):
+
+    ##################################################
+    ## CHEETAH GENERATED METHODS
+
+
+    def __init__(self, *args, **KWs):
+
+        Template.__init__(self, *args, **KWs)
+        if not self._CHEETAH__instanceInitialized:
+            cheetahKWArgs = {}
+            allowedKWs = 'searchList namespaces filter filtersLib errorCatcher'.split()
+            for k,v in KWs.items():
+                if k in allowedKWs: cheetahKWArgs[k] = v
+            self._initCheetahInstance(**cheetahKWArgs)
+        
+
+    def respond(self, trans=None):
+
+
+
+        ## CHEETAH: main method generated for this template
+        if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
+            trans = self.transaction # is None unless self.awake() was called
+        if not trans:
+            trans = DummyTransaction()
+            _dummyTrans = True
+        else: _dummyTrans = False
+        write = trans.response().write
+        SL = self._CHEETAH__searchList
+        _filter = self._CHEETAH__currentFilter
+        
+        ########################################
+        ## START - generated method body
+        
+        write('''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+    <script type="text/javascript" src="http://www.geodynamics.org/cig/portal_javascripts/Plone%20Default/ploneScripts3133.js"></script>
+    <script type="text/javascript" src="http://www.geodynamics.org/cig/portal_javascripts/Plone%20Default/ploneScripts1044.js"></script>
+    <style type="text/css"><!-- @import url(http://www.geodynamics.org/cig/portal_css/Plone%20Default/ploneStyles8697.css); --></style>
+    <style type="text/css" media="screen"><!-- @import url(http://www.geodynamics.org/cig/portal_css/Plone%20Default/ploneStyles4087.css); --></style>
+    <link rel="alternate stylesheet"
+          type="text/css" media="screen"
+          href="http://www.geodynamics.org/cig/portal_css/Plone%20Default/ploneStyles6585.css"
+          title="Small Text" />
+    <link rel="alternate stylesheet"
+          type="text/css" media="screen"
+          href="http://www.geodynamics.org/cig/portal_css/Plone%20Default/ploneStyles8555.css"
+          title="Large Text" />
+    <style type="text/css" media="all"><!-- @import url(http://www.geodynamics.org/cig/portal_css/Plone%20Default/ploneStyles5479.css); --></style>
+    <!-- Internet Explorer CSS Fixes -->
+    <!--[if lt IE 7]>
+        <style type="text/css" media="all">@import url(http://www.geodynamics.org/cig/IEFixes.css);</style>
+    <![endif]-->
+    <link href="/specfem3dglobe/css/style.css" type="text/css" rel="stylesheet" media="all" />
+    <title>''')
+        _v = VFFSL(SL,"title",True) # '$title' on line 22, col 12
+        if _v is not None: write(_filter(_v, rawExpr='$title')) # from line 22, col 12.
+        write('''</title>
+</head>
+<body>
+    ''')
+        _v = VFFSL(SL,"body",True) # '$body' on line 25, col 5
+        if _v is not None: write(_filter(_v, rawExpr='$body')) # from line 25, col 5.
+        write('''
+</body>
+</html>
+''')
+        
+        ########################################
+        ## END - generated method body
+        
+        return _dummyTrans and trans.response().getvalue() or ""
+        
+    ##################################################
+    ## CHEETAH GENERATED ATTRIBUTES
+
+
+    _CHEETAH__instanceInitialized = False
+
+    _CHEETAH_version = __CHEETAH_version__
+
+    _CHEETAH_versionTuple = __CHEETAH_versionTuple__
+
+    _CHEETAH_genTime = __CHEETAH_genTime__
+
+    _CHEETAH_genTimestamp = __CHEETAH_genTimestamp__
+
+    _CHEETAH_src = __CHEETAH_src__
+
+    _CHEETAH_srcLastModified = __CHEETAH_srcLastModified__
+
+    _mainCheetahMethod_for_Document= 'respond'
+
+## END CLASS DEFINITION
+
+if not hasattr(Document, '_initCheetahAttributes'):
+    templateAPIClass = getattr(Document, '_CHEETAH_templateClass', Template)
+    templateAPIClass._addCheetahPlumbingCodeToClass(Document)
+
+
+# CHEETAH was developed by Tavis Rudd and Mike Orr
+# with code, advice and input from many other volunteers.
+# For more information visit http://www.CheetahTemplate.org/
+
+##################################################
+## if run from command line:
+if __name__ == '__main__':
+    from Cheetah.TemplateCmdLineIface import CmdLineIface
+    CmdLineIface(templateObj=Document()).run()
+
+

Added: cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.html	                        (rev 0)
+++ cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -0,0 +1,101 @@
+
+<div id="portal-breadcrumbs">
+    <span id="breadcrumbs-you-are-here">You are here:</span> $breadcrumbs
+</div>
+
+
+<!--
+<div class="messages {% if messages %}active{% endif %}">{% if messages %}{{ messages|join:" " }}{% else %}&nbsp;{% endif %}</div>
+-->
+
+
+<table id="portal-columns">
+    <tbody>
+        <tr>
+            <td id="portal-column-one">
+                <div class="visualPadding">
+                    <dl class="portlet" id="portlet-navigation-tree">
+                        <dt class="portletHeader">
+                            Navigation
+                        </dt>
+                        <dd class="portletItem lastItem">
+                            <ul class="portletNavigationTree navTreeLevel0">
+                                $navTree
+                            </ul>
+                        </dd>
+                    </dl>
+                </div>
+            </td>
+            <td id="portal-column-content">
+                #if $browser.windowList
+                    <div id="content" class="documentEditable">
+                        <ul class="contentViews">
+                            #for $window in $browser.windowList
+                                #set $klass = $window is $browser.activeWindow and "selected" or "plain"
+                                <li class="$klass"><a href="$window.url">$window.title</a></li>
+                            #end for
+                        </ul>
+                        <div class="contentActions">
+                            <ul>
+                                <li>
+                                    <a href="javascript:toggleFullScreenMode();">
+                                        <img src="http://www.geodynamics.org/cig/fullscreenexpand_icon.gif"
+                                             alt="Toggle full screen mode"
+                                             title="Toggle full screen mode"
+                                             id="icon-full_screen" />
+                                    </a>
+                                </li>
+                                #if $browser.activeWindow.menuBar
+                                    #set $menuBar = $browser.activeWindow.menuBar[:]
+                                    #silent $menuBar.reverse()
+                                    #for $menu in $menuBar
+                                        <li>
+                                            <dl class="actionMenu" id="$menu.id">
+                                                <dt class="actionMenuHeader"><a href="$menu.url">$menu.title</a></dt>
+                                                <dd class="actionMenuContent">
+                                                    <ul>
+                                                        #for $item in $menu.items
+                                                            #set $klass = "visualIconPadding visualIcon"
+                                                            <li><a href="$item.url" class="$klass">$item.title</a></li>
+                                                        #end for
+                                                    </ul>
+                                                </dd>
+                                            </dl>
+                                        </li>
+                                    #end for
+                                #endif
+                            </ul>
+                        </div>
+                        <div class="documentContent" id="region-content">
+                            $design.render($browser.activeWindow.content)
+                        </div>
+                    </div>
+                #endif
+            </td>
+
+<!--
+            <td id="portal-column-two">
+                <div class="visualPadding">
+                    <dl class="portlet" id="portlet-tomato">
+                        <dt class="portletHeader">
+                            Tomato
+                        </dt>
+                        <dd class="portletItem">
+                            Life is a tomato.
+                        </dd>
+                    </dl>
+                    <dl class="portlet" id="portlet-tomato">
+                        <dt class="portletHeader">
+                            Tomato
+                        </dt>
+                        <dd class="portletItem">
+                            Life is a tomato.
+                        </dd>
+                    </dl>
+                </div>
+            </td>
+-->
+
+        </tr>
+    </tbody>
+</table>

Added: cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.py	                        (rev 0)
+++ cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.py	2008-03-22 03:37:05 UTC (rev 11498)
@@ -0,0 +1,262 @@
+#!/usr/bin/env python
+
+
+
+
+##################################################
+## DEPENDENCIES
+import sys
+import os
+import os.path
+from os.path import getmtime, exists
+import time
+import types
+import __builtin__
+from Cheetah.Version import MinCompatibleVersion as RequiredCheetahVersion
+from Cheetah.Version import MinCompatibleVersionTuple as RequiredCheetahVersionTuple
+from Cheetah.Template import Template
+from Cheetah.DummyTransaction import DummyTransaction
+from Cheetah.NameMapper import NotFound, valueForName, valueFromSearchList, valueFromFrameOrSearchList
+from Cheetah.CacheRegion import CacheRegion
+import Cheetah.Filters as Filters
+import Cheetah.ErrorCatchers as ErrorCatchers
+
+##################################################
+## MODULE CONSTANTS
+try:
+    True, False
+except NameError:
+    True, False = (1==1), (1==0)
+VFFSL=valueFromFrameOrSearchList
+VFSL=valueFromSearchList
+VFN=valueForName
+currentTime=time.time
+__CHEETAH_version__ = '2.0rc7'
+__CHEETAH_versionTuple__ = (2, 0, 0, 'candidate', 7)
+__CHEETAH_genTime__ = 1206128297.3114619
+__CHEETAH_genTimestamp__ = 'Fri Mar 21 12:38:17 2008'
+__CHEETAH_src__ = 'TreeBrowser.html'
+__CHEETAH_srcLastModified__ = 'Fri Mar 21 12:38:00 2008'
+__CHEETAH_docstring__ = 'Autogenerated by CHEETAH: The Python-Powered Template Engine'
+
+if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple:
+    raise AssertionError(
+      'This template was compiled with Cheetah version'
+      ' %s. Templates compiled before version %s must be recompiled.'%(
+         __CHEETAH_version__, RequiredCheetahVersion))
+
+##################################################
+## CLASSES
+
+class TreeBrowser(Template):
+
+    ##################################################
+    ## CHEETAH GENERATED METHODS
+
+
+    def __init__(self, *args, **KWs):
+
+        Template.__init__(self, *args, **KWs)
+        if not self._CHEETAH__instanceInitialized:
+            cheetahKWArgs = {}
+            allowedKWs = 'searchList namespaces filter filtersLib errorCatcher'.split()
+            for k,v in KWs.items():
+                if k in allowedKWs: cheetahKWArgs[k] = v
+            self._initCheetahInstance(**cheetahKWArgs)
+        
+
+    def respond(self, trans=None):
+
+
+
+        ## CHEETAH: main method generated for this template
+        if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
+            trans = self.transaction # is None unless self.awake() was called
+        if not trans:
+            trans = DummyTransaction()
+            _dummyTrans = True
+        else: _dummyTrans = False
+        write = trans.response().write
+        SL = self._CHEETAH__searchList
+        _filter = self._CHEETAH__currentFilter
+        
+        ########################################
+        ## START - generated method body
+        
+        write('\n<div id="portal-breadcrumbs">\n    <span id="breadcrumbs-you-are-here">You are here:</span> ')
+        _v = VFFSL(SL,"breadcrumbs",True) # '$breadcrumbs' on line 3, col 62
+        if _v is not None: write(_filter(_v, rawExpr='$breadcrumbs')) # from line 3, col 62.
+        write('''
+</div>
+
+
+<!--
+<div class="messages {% if messages %}active{% endif %}">{% if messages %}{{ messages|join:" " }}{% else %}&nbsp;{% endif %}</div>
+-->
+
+
+<table id="portal-columns">
+    <tbody>
+        <tr>
+            <td id="portal-column-one">
+                <div class="visualPadding">
+                    <dl class="portlet" id="portlet-navigation-tree">
+                        <dt class="portletHeader">
+                            Navigation
+                        </dt>
+                        <dd class="portletItem lastItem">
+                            <ul class="portletNavigationTree navTreeLevel0">
+                                ''')
+        _v = VFFSL(SL,"navTree",True) # '$navTree' on line 23, col 33
+        if _v is not None: write(_filter(_v, rawExpr='$navTree')) # from line 23, col 33.
+        write('''
+                            </ul>
+                        </dd>
+                    </dl>
+                </div>
+            </td>
+            <td id="portal-column-content">
+''')
+        if VFFSL(SL,"browser.windowList",True): # generated from line 30, col 17
+            write('                    <div id="content" class="documentEditable">\n                        <ul class="contentViews">\n')
+            for window in VFFSL(SL,"browser.windowList",True): # generated from line 33, col 29
+                klass = VFFSL(SL,"window",True) is VFFSL(SL,"browser.activeWindow",True) and "selected" or "plain"
+                write('                                <li class="')
+                _v = VFFSL(SL,"klass",True) # '$klass' on line 35, col 44
+                if _v is not None: write(_filter(_v, rawExpr='$klass')) # from line 35, col 44.
+                write('"><a href="')
+                _v = VFFSL(SL,"window.url",True) # '$window.url' on line 35, col 61
+                if _v is not None: write(_filter(_v, rawExpr='$window.url')) # from line 35, col 61.
+                write('">')
+                _v = VFFSL(SL,"window.title",True) # '$window.title' on line 35, col 74
+                if _v is not None: write(_filter(_v, rawExpr='$window.title')) # from line 35, col 74.
+                write('</a></li>\n')
+            write('''                        </ul>
+                        <div class="contentActions">
+                            <ul>
+                                <li>
+                                    <a href="javascript:toggleFullScreenMode();">
+                                        <img src="http://www.geodynamics.org/cig/fullscreenexpand_icon.gif"
+                                             alt="Toggle full screen mode"
+                                             title="Toggle full screen mode"
+                                             id="icon-full_screen" />
+                                    </a>
+                                </li>
+''')
+            if VFFSL(SL,"browser.activeWindow.menuBar",True): # generated from line 48, col 33
+                menuBar = VFN(VFFSL(SL,"browser.activeWindow",True),"menuBar",True)[:]
+                VFN(VFFSL(SL,"menuBar",True),"reverse",False)()
+                for menu in VFFSL(SL,"menuBar",True): # generated from line 51, col 37
+                    write('                                        <li>\n                                            <dl class="actionMenu" id="')
+                    _v = VFFSL(SL,"menu.id",True) # '$menu.id' on line 53, col 72
+                    if _v is not None: write(_filter(_v, rawExpr='$menu.id')) # from line 53, col 72.
+                    write('">\n                                                <dt class="actionMenuHeader"><a href="')
+                    _v = VFFSL(SL,"menu.url",True) # '$menu.url' on line 54, col 87
+                    if _v is not None: write(_filter(_v, rawExpr='$menu.url')) # from line 54, col 87.
+                    write('">')
+                    _v = VFFSL(SL,"menu.title",True) # '$menu.title' on line 54, col 98
+                    if _v is not None: write(_filter(_v, rawExpr='$menu.title')) # from line 54, col 98.
+                    write('''</a></dt>
+                                                <dd class="actionMenuContent">
+                                                    <ul>
+''')
+                    for item in VFFSL(SL,"menu.items",True): # generated from line 57, col 57
+                        klass = "visualIconPadding visualIcon"
+                        write('                                                            <li><a href="')
+                        _v = VFFSL(SL,"item.url",True) # '$item.url' on line 59, col 74
+                        if _v is not None: write(_filter(_v, rawExpr='$item.url')) # from line 59, col 74.
+                        write('" class="')
+                        _v = VFFSL(SL,"klass",True) # '$klass' on line 59, col 92
+                        if _v is not None: write(_filter(_v, rawExpr='$klass')) # from line 59, col 92.
+                        write('">')
+                        _v = VFFSL(SL,"item.title",True) # '$item.title' on line 59, col 100
+                        if _v is not None: write(_filter(_v, rawExpr='$item.title')) # from line 59, col 100.
+                        write('</a></li>\n')
+                    write('''                                                    </ul>
+                                                </dd>
+                                            </dl>
+                                        </li>
+''')
+            write('''                            </ul>
+                        </div>
+                        <div class="documentContent" id="region-content">
+                            ''')
+            _v = VFN(VFFSL(SL,"design",True),"render",False)(VFFSL(SL,"browser.activeWindow.content",True)) # '$design.render($browser.activeWindow.content)' on line 70, col 29
+            if _v is not None: write(_filter(_v, rawExpr='$design.render($browser.activeWindow.content)')) # from line 70, col 29.
+            write('''
+                        </div>
+                    </div>
+''')
+        write('''            </td>
+
+<!--
+            <td id="portal-column-two">
+                <div class="visualPadding">
+                    <dl class="portlet" id="portlet-tomato">
+                        <dt class="portletHeader">
+                            Tomato
+                        </dt>
+                        <dd class="portletItem">
+                            Life is a tomato.
+                        </dd>
+                    </dl>
+                    <dl class="portlet" id="portlet-tomato">
+                        <dt class="portletHeader">
+                            Tomato
+                        </dt>
+                        <dd class="portletItem">
+                            Life is a tomato.
+                        </dd>
+                    </dl>
+                </div>
+            </td>
+-->
+
+        </tr>
+    </tbody>
+</table>
+''')
+        
+        ########################################
+        ## END - generated method body
+        
+        return _dummyTrans and trans.response().getvalue() or ""
+        
+    ##################################################
+    ## CHEETAH GENERATED ATTRIBUTES
+
+
+    _CHEETAH__instanceInitialized = False
+
+    _CHEETAH_version = __CHEETAH_version__
+
+    _CHEETAH_versionTuple = __CHEETAH_versionTuple__
+
+    _CHEETAH_genTime = __CHEETAH_genTime__
+
+    _CHEETAH_genTimestamp = __CHEETAH_genTimestamp__
+
+    _CHEETAH_src = __CHEETAH_src__
+
+    _CHEETAH_srcLastModified = __CHEETAH_srcLastModified__
+
+    _mainCheetahMethod_for_TreeBrowser= 'respond'
+
+## END CLASS DEFINITION
+
+if not hasattr(TreeBrowser, '_initCheetahAttributes'):
+    templateAPIClass = getattr(TreeBrowser, '_CHEETAH_templateClass', Template)
+    templateAPIClass._addCheetahPlumbingCodeToClass(TreeBrowser)
+
+
+# CHEETAH was developed by Tavis Rudd and Mike Orr
+# with code, advice and input from many other volunteers.
+# For more information visit http://www.CheetahTemplate.org/
+
+##################################################
+## if run from command line:
+if __name__ == '__main__':
+    from Cheetah.TemplateCmdLineIface import CmdLineIface
+    CmdLineIface(templateObj=TreeBrowser()).run()
+
+

Added: cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/__init__.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/__init__.py	                        (rev 0)
+++ cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/__init__.py	2008-03-22 03:37:05 UTC (rev 11498)
@@ -0,0 +1,113 @@
+
+
+from Desktop import Desktop
+from Document import Document
+from TreeBrowser import TreeBrowser
+
+
+class PloneDesign(object):
+
+    def render(self, item):
+        v = 'render' + item.__class__.__name__
+        m = getattr(self, v)
+        return m(item)
+
+    def renderAsDocument(self, item):
+        template = self.newDocumentTemplate()
+        template.title = item.title
+        template.body = self.render(item)
+        return template
+
+    def renderDesktop(self, desktop):
+        template = self.newDesktopTemplate()
+        template.desktop = desktop
+        template.activeWindow = self.render(desktop.activeWindow)
+        template.root = desktop.url
+        return template
+
+    def renderFileBrowser(self, browser):
+        return self.renderTreeBrowser(browser)
+
+    def renderTreeBrowser(self, browser):
+        template = self.newTreeBrowserTemplate()
+        template.design = self
+        template.browser = browser
+        template.breadcrumbs = self.renderBreadcrumbs(browser.breadcrumbs())
+        template.navTree = browser.renderNavTree(self)
+        return template
+
+    def renderStaticContent(self, content):
+        return content.html
+
+    navTreeItemFormat = """
+<li class="navTreeItem %s">
+    <div class="visualIcon %s">
+        <a href="%s" class="visualIconPadding %s">%s</a>
+    </div>
+    %s
+</li>"""
+
+    def renderNavTreeDirectory(self, title, url, level, items, selected):
+        aClass = ""
+        if items:
+            items = '<ul class="navTree navTreeLevel%d">%s</ul>' % (level, items)
+        if selected:
+            aClass = "navTreeCurrentItem"
+        return self.navTreeItemFormat % ("visualNoMarker", "contenttype-folder", url, aClass, title, items)
+
+    def renderNavTreeFile(self, title, url, selected):
+        aClass = ""
+        if selected:
+            aClass = "navTreeCurrentItem"
+        return self.navTreeItemFormat % ("", "contenttype-document", url, aClass, title, "")
+
+    def renderForm(self, form):
+        class FormRenderer(object):
+            def render(self, item):
+                v = 'render' + item.__class__.__name__
+                m = getattr(self, v)
+                return m(item)
+            def renderForm(self, form):
+                body = ''
+                for item in form.items:
+                    body += self.render(item)
+                return '<form>' + body + '</form>'
+            def renderFieldSet(self, fieldSet):
+                body = ''
+                for item in fieldSet.items:
+                    body += self.render(item)
+                if fieldSet.legend:
+                    legend = '<legend>%s</legend>' % fieldSet.legend
+                else:
+                    legend = ''
+                return '<fieldset>' + legend + body + '</fieldset>'
+            def renderIntegerField(self, field): return self.renderField(field)
+            def renderFloatField(self, field): return self.renderField(field)
+            def renderSelectField(self, field): return self.renderField(field)
+            def renderField(self, field):
+                if field.tip:
+                    tip = '<a title="%s">?</a>' % field.tip
+                else:
+                    tip = ''
+                if field.label:
+                    label = '<label for="id_%s">%s:</label>&nbsp;' % (field.field.field_name, field.label)
+                else:
+                    label = ''
+                return '<p>' + label + field.field.render(None) + tip
+        renderer = FormRenderer()
+        return renderer.render(form)
+
+    def newDocumentTemplate(self):
+        return Document()
+
+    def newDesktopTemplate(self):
+        return Desktop()
+
+    def newTreeBrowserTemplate(self):
+        return TreeBrowser()
+
+    def renderBreadcrumbs(self, breadcrumbs):
+        breadcrumbSeparator = ' <span class="breadcrumbSeparator">&rarr;</span> '
+        lastFormat = '<span dir="ltr"><span>%s</span></span>'
+        links = ['<a href="%s">%s</a>' % (url, title) for url, title in breadcrumbs[:-1]]
+        return breadcrumbSeparator.join(links + [lastFormat % breadcrumbs[-1][1]])

Added: cs/portal/trunk/seismo/SeismoWebPortal/gui.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/gui.py	                        (rev 0)
+++ cs/portal/trunk/seismo/SeismoWebPortal/gui.py	2008-03-22 03:37:05 UTC (rev 11498)
@@ -0,0 +1,177 @@
+
+
+class WindowParent(object):
+
+    def __init__(self):
+        self.windowList = []
+        self.activeWindow = None
+
+    def insertWindow(self, newWindow):
+        self.windowList.append(newWindow)
+
+    def selectWindow(self, aWindow):
+        if not aWindow in self.windowList:
+            self.insertWindow(aWindow)
+        self.activeWindow = aWindow
+
+
+class Desktop(WindowParent):
+
+    def __init__(self, url, title):
+        WindowParent.__init__(self)
+        self.url = url
+        self.title = title
+        self.user = None
+
+
+class Window(object):
+
+    def __init__(self, url, title):
+        self.url = url
+        self.title = title
+
+
+class ParentWindow(Window, WindowParent):
+    
+    def __init__(self, url, title):
+        Window.__init__(self, url, title)
+        WindowParent.__init__(self)
+
+
+
+class ChildWindow(Window):
+
+    def __init__(self, url, title):
+        Window.__init__(self, url, title)
+        self.menuBar = None
+        self.content = None
+        return
+
+
+class Menu(object):
+
+    def __init__(self, id, url, title, items):
+        self.id = id
+        self.url = url
+        self.title = title
+        self.items = items
+
+
+class MenuItem(object):
+    
+    def __init__(self, url, title):
+        self.url = url
+        self.title = title
+
+
+class StaticContent(object):
+    def __init__(self, html):
+        self.html = html
+
+
+#------------------------------------------------------------------------
+# virtual file system
+
+
+class Node(object):
+
+    def __init__(self, name, title):
+        self.name = name
+        self.title = title
+
+    def urlFragment(self): return self.name + '/'
+
+    def renderNavTree(self, urlRoot, path, level, design):
+        return ""
+
+
+class Directory(Node):
+
+    def __init__(self, name, title, contents):
+        Node.__init__(self, name, title)
+        self.contents = contents
+        
+        self.index = {}
+        for node in contents:
+            self.index[node.name] = node
+
+        return
+
+    def appendNode(self, node):
+        self.contents.append(node)
+        self.index[node.name] = node
+
+    def xresolve(self, request, path):
+        if not path:
+            return [self]
+        name = path.pop(0)
+        try:
+            item = self.index[name]
+        except KeyError:
+            if not name:
+                return [self]
+            raise Http404
+        return [self] + item.resolve(request, path)
+
+    def renderNavTree(self, urlRoot, path, level, design):
+        url = urlRoot + self.urlFragment()
+        items = ""
+        selected = False
+        if len(path) > level and path[level] is self:
+            items = self.renderNavTreeItems(url, path, level, design)
+            if level == len(path) - 1:
+                selected = True
+        return design.renderNavTreeDirectory(self.title, url, level, items, selected)
+
+    def renderNavTreeItems(self, urlRoot, path, level, design):
+        items = ""
+        for node in self.contents:
+            items += node.renderNavTree(urlRoot, path, level + 1, design)
+        return items
+
+
+class File(Node):
+
+    def xresolve(self, request, path):
+        if path:
+            raise Http404
+        return [self]
+
+    def urlFragment(self): return self.name
+
+    def renderNavTree(self, urlRoot, path, level, design):
+        url = urlRoot + self.urlFragment()
+        selected = len(path) > level and path[level] is self
+        return design.renderNavTreeFile(self.title, url, selected)
+
+
+
+class TreeBrowser(ParentWindow):
+
+    def __init__(self, url, title, root):
+        ParentWindow.__init__(self, url, title)
+        self.root = root
+        self.path = [root]
+
+    def xresolve(self, request, path):
+        self.path = self.root.resolve(request, path)
+        return [self] + self.path[1:]
+
+    def breadcrumbs(self):
+        path = self.path
+        root = self.root #path[0]
+        path = path[1:]
+        bc = [(self.url, self.title)]
+        urlRoot = self.url
+        for node in path:
+            url = urlRoot + node.urlFragment()
+            crumb = url, node.title
+            bc.append(crumb)
+        return bc
+
+    def renderNavTree(self, design):
+        return self.root.renderNavTreeItems(self.url, self.path, 0, design)
+
+
+class FileBrowser(TreeBrowser):
+    pass

Added: cs/portal/trunk/seismo/SeismoWebPortal/list_detail.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/list_detail.py	                        (rev 0)
+++ cs/portal/trunk/seismo/SeismoWebPortal/list_detail.py	2008-03-22 03:37:05 UTC (rev 11498)
@@ -0,0 +1,126 @@
+from django.template import loader, RequestContext
+from django.http import Http404, HttpResponse
+from django.core.xheaders import populate_xheaders
+from django.core.paginator import ObjectPaginator, InvalidPage
+from django.core.exceptions import ObjectDoesNotExist
+import gui
+
+def object_list(request, desktop, window, queryset, paginate_by=None, page=None,
+        allow_empty=False, template_name=None, template_loader=loader,
+        extra_context=None, context_processors=None, template_object_name='object',
+        mimetype=None):
+    """
+    Generic list of objects.
+
+    Templates: ``<app_label>/<model_name>_list.html``
+    Context:
+        object_list
+            list of objects
+        is_paginated
+            are the results paginated?
+        results_per_page
+            number of objects per page (if paginated)
+        has_next
+            is there a next page?
+        has_previous
+            is there a prev page?
+        page
+            the current page
+        next
+            the next page
+        previous
+            the previous page
+        pages
+            number of pages, total
+        hits
+            number of objects, total
+    """
+    if extra_context is None: extra_context = {}
+    queryset = queryset._clone()
+    if paginate_by:
+        paginator = ObjectPaginator(queryset, paginate_by)
+        if not page:
+            page = request.GET.get('page', 1)
+        try:
+            page = int(page)
+            object_list = paginator.get_page(page - 1)
+        except (InvalidPage, ValueError):
+            if page == 1 and allow_empty:
+                object_list = []
+            else:
+                raise Http404
+        c = RequestContext(request, {
+            '%s_list' % template_object_name: object_list,
+            'is_paginated': paginator.pages > 1,
+            'results_per_page': paginate_by,
+            'has_next': paginator.has_next_page(page - 1),
+            'has_previous': paginator.has_previous_page(page - 1),
+            'page': page,
+            'next': page + 1,
+            'previous': page - 1,
+            'pages': paginator.pages,
+            'hits' : paginator.hits,
+        }, context_processors)
+    else:
+        c = RequestContext(request, {
+            '%s_list' % template_object_name: queryset,
+            'is_paginated': False
+        }, context_processors)
+        if not allow_empty and len(queryset) == 0:
+            raise Http404
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    if not template_name:
+        model = queryset.model
+        template_name = "%s/%s_list.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    window.content = gui.StaticContent(t.render(c))
+    desktop.activeWindow.selectWindow(window)
+    return desktop
+
+def object_detail(request, desktop, window, queryset, object_id=None, slug=None,
+        slug_field=None, template_name=None, template_name_field=None,
+        template_loader=loader, extra_context=None,
+        context_processors=None, template_object_name='object',
+        mimetype=None):
+    """
+    Generic list of objects.
+
+    Templates: ``<app_label>/<model_name>_detail.html``
+    Context:
+        object
+            the object
+    """
+    if extra_context is None: extra_context = {}
+    model = queryset.model
+    if object_id:
+        queryset = queryset.filter(pk=object_id)
+    elif slug and slug_field:
+        queryset = queryset.filter(**{slug_field: slug})
+    else:
+        raise AttributeError, "Generic detail view must be called with either an object_id or a slug/slug_field."
+    try:
+        obj = queryset.get()
+    except ObjectDoesNotExist:
+        raise Http404, "No %s found matching the query" % (model._meta.verbose_name)
+    if not template_name:
+        template_name = "%s/%s_detail.html" % (model._meta.app_label, model._meta.object_name.lower())
+    if template_name_field:
+        template_name_list = [getattr(obj, template_name_field), template_name]
+        t = template_loader.select_template(template_name_list)
+    else:
+        t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        template_object_name: obj,
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    window.content = gui.StaticContent(t.render(c))
+    desktop.activeWindow.selectWindow(window)
+    return desktop

Modified: cs/portal/trunk/seismo/SeismoWebPortal/static/css/style.css
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/static/css/style.css	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/static/css/style.css	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,624 +1,620 @@
-
-body {
-    font-family: sans-serif;
-}
-
-img {
-    border-width: 0;
-}
-
-#logo {
-    vertical-align: middle;
-}
-
-.illustration {
-    margin-left: auto;
-    margin-right: auto;
-}
-
-.caption {
-    font-style: italic;
-}
-
-li.selected {
-    font-weight: bold;
-    color: black;
-    background-color: orange;
-}
-
-
-/* banner */
-
-.banner #logos {
-    float: left;
-}
-
-.banner img {
-    vertical-align: middle;
-}
-
-.banner #sflogo {
-    padding-top: 16px;
-}
-
-.banner h1 {
-    margin-top: 0;
-    margin-bottom: 0;
-    padding-top: 16px;
-}
-
-.banner #sf3dg {
-    color: navy;
-}
-
-.banner #webportal {
-    color: gray;
-}
-
-
-/* messages */
-
-.messages {
-    font-weight: bold;
-    padding: .2em .2em .2em .2em;
-    border: thin solid white;
-    clear: both;
-}
-
-.active {
-    background-color: yellow;
-    border: thin solid black;
-}
-
-
-/* help */
-
-.help {
-    border-style: double;
-    border-color: black;
-    background-color: #ffc;
-}
-
-div.help {
-    padding: 1em 1em 1em 1em;
-}
-
-span.help {
-    margin: 0em .2em 1em 1em;
-    padding: .2em .2em .2em .2em;
-    float: left;
-    width: 20em;
-}
-
-dl.help {
-    margin: 1em 1em 1em 1em;
-    padding: 1em 1em 1em 1em;
-    clear: both;
-}
-
-dl.help dt {
-    font-weight: bold;
-}
-
-.help div.illustration {
-    border: 1px solid black;
-    padding: 1em 1em 1em 1em;
-    background-color: white;
-}
-
-
-/* home, login */
-
-div.splash {
-    font-size: large;
-    text-align: center;
-}
-
-#presented {
-    display: none;
-}
-
-.producers li {
-    list-style: none;
-}
-
-.producers a {
-    color: gray;
-    text-decoration: none;
-    text-transform: uppercase;
-}
-
-.nameplate {
-    width: 80%;
-    margin-top: 1em;
-    margin-left: auto;
-    margin-right: auto;
-    color: gray;
-}
-
-.nameplate h1 {
-    color: white;
-    background-color: navy;
-    font-family: serif;
-    font-size: 48pt;
-    font-weight: normal;
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-.splash a.button {
-    text-transform: capitalize;
-}
-
-.links li {
-    list-style: none;
-    display: inline;
-    padding-left: .5em;
-    padding-right: .5em;
-    border-right: 1px solid black;
-    font-size: small;
-}
-
-.links li.last {
-    border-right: 0;
-}
-
-#sponsored {
-    /*display: none;*/
-    font-style: italic;
-}
-
-ul.sponsors {
-    text-align: center;
-    background: white;
-}
-
-.sponsors li {
-    list-style: none;
-    display: inline;
-    margin-left: 1em;
-    margin-right: 1em;
-}
-
-.sponsors img {
-    vertical-align: middle;
-}
-
-
-/* registration */
-
-#usermap {
-    width: 500px;
-}
-
-
-/* login display */
-
-div.login {
-    float: right;
-    background-color: white;
-}
-
-.login li {
-    list-style: none;
-}
-
-.login li {
-    display: inline;
-    padding-left: .5em;
-    padding-right: .5em;
-}
-
-#greeting {
-    font-weight: bold;
-    font-style: italic;
-}
-
-
-/* taskbar */
-
-div.taskbar {
-    clear: both;
-}
-
-.taskbar ul {
-    list-style: none;
-    border-top: 1px solid black;
-    border-bottom: 1px solid black;
-    padding-top: 2px;
-    padding-bottom: 2px;
-    margin-left: 0;
-    background-color: #eee;
-    line-height: 200%;
-}
-
-.taskbar li {
-    display: inline;
-    border-style: outset;
-    font-size: large;
-    margin-left: .1em;
-    margin-right: .1em;
-}
-
-.taskbar a {
-    text-decoration: none;
-    color: black;
-    padding-left: 1em;
-    padding-right: 1em;
-}
-
-.taskbar li.selected {
-    border-style: inset;
-}
-
-
-/* tabs */
-
-div.tabs {
-    clear: both;
-}
-
-.tabs ul {
-    list-style: none;
-    margin-left: 0;
-    border-bottom: thick solid orange;
-}
-
-.tabs li {
-    display: inline;
-    border-top: 1px solid black;
-    border-right: 1px solid black;
-    font-size: large;
-}
-
-.tabs li.first {
-    border-left: 1px solid black;
-}
-
-.tabs a {
-    text-decoration: none;
-    color: black;
-    padding-left: 1em;
-    padding-right: 1em;
-}
-
-.tabs li.selected {
-    border-bottom: thin solid orange;
-}
-
-
-/* titlebars */
-
-.titlebar {
-/*
-    border: thin solid blue;
-    background-color: #ccf;
-*/
-    color: white;
-}
-
-h1.titlebar {
-    background-color: navy;
-}
-
-h2.titlebar {
-    background-color: blue;
-}
-
-.titlebar img {
-    vertical-align: middle;
-}
-
-
-/* toolbars */
-
-div.toolbar {
-    padding: .4em 1em .4em 1em;
-    margin: .6em 0em .6em 0em;
-    border-top: 1px solid black;
-    border-bottom: 1px solid black;
-    background-color: #eee;
-}
-
-.toolbar img {
-    vertical-align: middle;
-}
-
-.toolbar form {
-    display: inline;
-}
-
-
-/* infobars */
-
-.infobar {
-    border-bottom: medium double black;
-}
-
-
-/* tables */
-
-table {
-    border: thin solid black;
-}
-
-table caption {
-    font-size: large;
-    background-color: #ccf;
-}
-
-.even {
-    background-color: #eef;
-}
-
-tr.title {
-    color: white;
-    background-color: #88f;
-    border-top: 1px solid black;
-}
-
-th {
-    text-align: left;
-    padding-left: 1em;
-    padding-right: 1em;
-}
-
-th.colgroup {
-    text-align: center;
-    background-color: #ffd;
-    border-bottom: thin dotted purple;
-}
-
-td {
-    padding-left: 1em;
-    padding-right: 1em;
-}
-
-ul.output {
-    list-style: none;
-    font-family: monospace;
-    margin: 0 0 0 0;
-    padding: 0 0 0 0;
-}
-
-.output li {
-    display: inline;
-}
-
-.True {
-    text-transform: lowercase;
-}
-
-.False {
-    text-transform: lowercase;
-}
-
-span.True:before {
-    content: url(/specfem3dglobe/pics/icon-yes.gif) " ";
-}
-
-span.False:before {
-    content: url(/specfem3dglobe/pics/icon-no.gif) " ";
-}
-
-.float {
-    text-align: right;
-}
-
-.int {
-    text-align: right;
-}
-
-.notApplicable {
-    color: gray;
-    text-align: center;
-}
-
-.inlineInfo {
-    font-size: small;
-}
-
-table .beachball {
-    float: left;
-}
-
-.new {
-    background-color: yellow;
-}
-
-
-/* detail views */
-
-.properties dt {
-    width: 50%;
-    font-weight: bold;
-    float: left;
-    text-align: right;
-    margin-right: 1ex;
-    clear: both;
-    padding-top: .2em;
-    padding-bottom: .2em;
-}
-
-.properties dt:after {
-    content: ":";
-}
-
-.properties dd {
-    height: 1.3em;
-    padding-top: .2em;
-    padding-bottom: .2em;
-}
-
-/*** experimental floating properties
-div.box {
-    float: left;
-    padding: 1em;
-    margin: 1em;
-    border: 1px solid gray;
-}
-
-div.box h3 {
-    margin: 0;
-    text-align: center;
-}
-***/
-
-/* for experimental confirmation page */
-table.properties td {
-    border: 1px solid gray;
-}
-
-
-
-/* forms */
-
-fieldset {
-    margin: 1em;
-    padding: 1em;
-    clear: both;
-}
-
-form fieldset legend {
-    font-size: x-large;
-}
-
-fieldset fieldset {
-    float: left;
-}
-
-fieldset fieldset legend {
-    font-size: large;
-}
-
-form div {
-    padding-top: .2em;
-    padding-bottom: .2em;
-    clear: both;
-}
-
-form p {
-    clear: both;
-}
-
-.error {
-    font-weight: bold;
-    color: red;
-}
-
-form span.error {
-    margin: 0em .2em 1em 1em;
-    padding: .2em .2em .2em .2em;
-}
-
-.computed {
-    font-weight: bold;
-    background-color: #fcc;
-    border: thin solid red;
-}
-
-label.before {
-    font-weight: bold;
-    float: left;
-    text-align: right;
-    margin-right: 1ex;
-}
-
-.tab30ex label.before {
-    width: 30ex;
-}
-
-.tab30ex fieldset label.before {
-    /* account for the fieldset margin & padding */
-    width: 26ex;
-}
-
-.tab30ex label.after {
-    /*float: left;*/
-}
-
-.tab30ex .checkbox { margin-left: 30ex; }
-.tab30ex .radio { margin-left: 30ex; }
-
-.tab30ex fieldset .checkbox {
-    /* account for the fieldset margin & padding */
-    margin-left: 26ex;
-}
-
-.tab30ex fieldset .radio {
-    /* account for the fieldset margin & padding */
-    margin-left: 26ex;
-}
-
-.tab30ex fieldset fieldset .checkbox { margin-left: 0; }
-.tab30ex fieldset fieldset .radio { margin-left: 0; }
-
-.radio ul {
-    list-style: none;
-}
-
-label.before:after {
-    content: ":";
-}
-
-.tab30ex input.vIntegerField {
-    float: left;
-}
-
-.tab30ex input.vFloatField {
-    float: left;
-}
-
-.tab30ex input.vCheckboxField {
-    float: left;
-}
-
-.tab30ex select.vSelectField {
-    float: left;
-    margin-bottom: 1em;
-}
-
-input.reset {
-    float: right;
-}
-
-input.submit {
-    margin-top: 2em;
-    margin-bottom: 2em;
-}
-
-.tab30ex input.submit {
-    margin-left: 30ex;
-}
-
-
-/* events */
-
-#cmtsolutionIllustration {
-    width: 700px;
-}
-
-#sourceBeachballMw {
-    font-size: larger;
-}
-
-.cmtsolution pre {
-    border: 1px solid black;
-    padding: 1em;
-    background-color: #eee;
-}
-
-
-/* stations */
-
-#stations {
-    width: 576px;
-}
-
-
-
-/* misc. */
-
-.greek {
-    text-transform: none;
-}
+
+img {
+    border-width: 0;
+}
+
+#logo {
+    vertical-align: middle;
+}
+
+.illustration {
+    margin-left: auto;
+    margin-right: auto;
+}
+
+.caption {
+    font-style: italic;
+}
+
+
+/* banner */
+
+.banner #logos {
+    float: left;
+}
+
+.banner img {
+    vertical-align: middle;
+}
+
+.banner #sflogo {
+    padding-top: 16px;
+}
+
+.banner h1 {
+    margin-top: 0;
+    margin-bottom: 0;
+    padding-top: 16px;
+}
+
+.banner #sf3dg {
+    color: navy;
+}
+
+.banner #webportal {
+    color: gray;
+}
+
+
+/* messages */
+
+.messages {
+    font-weight: bold;
+    padding: .2em .2em .2em .2em;
+    border: thin solid white;
+    clear: both;
+}
+
+.active {
+    background-color: yellow;
+    border: thin solid black;
+}
+
+
+/* help */
+
+.help {
+    border-style: double;
+    border-color: black;
+    background-color: #ffc;
+}
+
+div.help {
+    padding: 1em 1em 1em 1em;
+}
+
+span.help {
+    margin: 0em .2em 1em 1em;
+    padding: .2em .2em .2em .2em;
+    float: left;
+    width: 20em;
+}
+
+dl.help {
+    margin: 1em 1em 1em 1em;
+    padding: 1em 1em 1em 1em;
+    clear: both;
+}
+
+dl.help dt {
+    font-weight: bold;
+}
+
+.help div.illustration {
+    border: 1px solid black;
+    padding: 1em 1em 1em 1em;
+    background-color: white;
+}
+
+
+/* home, login */
+
+div.splash {
+    font-size: large;
+    text-align: center;
+}
+
+#presented {
+    display: none;
+}
+
+.producers li {
+    list-style: none;
+}
+
+.producers a {
+    color: gray;
+    text-decoration: none;
+    text-transform: uppercase;
+}
+
+.nameplate {
+    width: 80%;
+    margin-top: 1em;
+    margin-left: auto;
+    margin-right: auto;
+    color: gray;
+}
+
+.nameplate h1 {
+    color: white;
+    background-color: navy;
+    font-family: serif;
+    font-size: 48pt;
+    font-weight: normal;
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+.splash a.button {
+    text-transform: capitalize;
+}
+
+.links li {
+    list-style: none;
+    display: inline;
+    padding-left: .5em;
+    padding-right: .5em;
+    border-right: 1px solid black;
+    font-size: small;
+}
+
+.links li.last {
+    border-right: 0;
+}
+
+#sponsored {
+    /*display: none;*/
+    font-style: italic;
+}
+
+ul.sponsors {
+    text-align: center;
+    background: white;
+}
+
+.sponsors li {
+    list-style: none;
+    display: inline;
+    margin-left: 1em;
+    margin-right: 1em;
+}
+
+.sponsors img {
+    vertical-align: middle;
+}
+
+
+/* registration */
+
+#usermap {
+    width: 500px;
+}
+
+
+/* login display */
+
+div.login {
+    float: right;
+    background-color: white;
+}
+
+.login li {
+    list-style: none;
+}
+
+.login li {
+    display: inline;
+    padding-left: .5em;
+    padding-right: .5em;
+}
+
+#greeting {
+    font-weight: bold;
+    font-style: italic;
+}
+
+
+/* taskbar */
+
+div.taskbar {
+    clear: both;
+}
+
+.taskbar ul {
+    list-style: none;
+    border-top: 1px solid black;
+    border-bottom: 1px solid black;
+    padding-top: 2px;
+    padding-bottom: 2px;
+    margin-left: 0;
+    background-color: #eee;
+    line-height: 200%;
+}
+
+.taskbar li {
+    display: inline;
+    border-style: outset;
+    font-size: large;
+    margin-left: .1em;
+    margin-right: .1em;
+}
+
+.taskbar a {
+    text-decoration: none;
+    color: black;
+    padding-left: 1em;
+    padding-right: 1em;
+}
+
+.taskbar li.selected {
+    border-style: inset;
+    font-weight: bold;
+    color: black;
+    background-color: orange;
+}
+
+
+/* tabs */
+
+div.tabs {
+    clear: both;
+}
+
+.tabs ul {
+    list-style: none;
+    margin-left: 0;
+    border-bottom: thick solid orange;
+}
+
+.tabs li {
+    display: inline;
+    border-top: 1px solid black;
+    border-right: 1px solid black;
+    font-size: large;
+}
+
+.tabs li.first {
+    border-left: 1px solid black;
+}
+
+.tabs a {
+    text-decoration: none;
+    color: black;
+    padding-left: 1em;
+    padding-right: 1em;
+}
+
+.tabs li.selected {
+    border-bottom: thin solid orange;
+    font-weight: bold;
+    color: black;
+    background-color: orange;
+}
+
+
+/* titlebars */
+
+.titlebar {
+/*
+    border: thin solid blue;
+    background-color: #ccf;
+*/
+    color: white;
+}
+
+h1.titlebar {
+    background-color: navy;
+}
+
+h2.titlebar {
+    background-color: blue;
+}
+
+.titlebar img {
+    vertical-align: middle;
+}
+
+
+/* toolbars */
+
+div.toolbar {
+    padding: .4em 1em .4em 1em;
+    margin: .6em 0em .6em 0em;
+    border-top: 1px solid black;
+    border-bottom: 1px solid black;
+    background-color: #eee;
+}
+
+.toolbar img {
+    vertical-align: middle;
+}
+
+.toolbar form {
+    display: inline;
+}
+
+
+/* infobars */
+
+.infobar {
+    border-bottom: medium double black;
+}
+
+
+/* tables */
+
+table.cool {
+    border: thin solid black;
+}
+
+table.cool caption {
+    font-size: large;
+    background-color: #ccf;
+}
+
+table.cool .even {
+    background-color: #eef;
+}
+
+table.cool tr.title {
+    color: white;
+    background-color: #88f;
+    border-top: 1px solid black;
+}
+
+table.cool th {
+    text-align: left;
+    padding-left: 1em;
+    padding-right: 1em;
+}
+
+table.cool th.colgroup {
+    text-align: center;
+    background-color: #ffd;
+    border-bottom: thin dotted purple;
+}
+
+table.cool td {
+    padding-left: 1em;
+    padding-right: 1em;
+}
+
+ul.output {
+    list-style: none;
+    font-family: monospace;
+    margin: 0 0 0 0;
+    padding: 0 0 0 0;
+}
+
+.output li {
+    display: inline;
+}
+
+.True {
+    text-transform: lowercase;
+}
+
+.False {
+    text-transform: lowercase;
+}
+
+span.True:before {
+    content: url(/specfem3dglobe/pics/icon-yes.gif) " ";
+}
+
+span.False:before {
+    content: url(/specfem3dglobe/pics/icon-no.gif) " ";
+}
+
+.float {
+    text-align: right;
+}
+
+.int {
+    text-align: right;
+}
+
+.notApplicable {
+    color: gray;
+    text-align: center;
+}
+
+.inlineInfo {
+    font-size: small;
+}
+
+table .beachball {
+    float: left;
+}
+
+.new {
+    background-color: yellow;
+}
+
+
+/* detail views */
+
+.properties dt {
+    width: 50%;
+    font-weight: bold;
+    float: left;
+    text-align: right;
+    margin-right: 1ex;
+    clear: both;
+    padding-top: .2em;
+    padding-bottom: .2em;
+}
+
+.properties dt:after {
+    content: ":";
+}
+
+.properties dd {
+    height: 1.3em;
+    padding-top: .2em;
+    padding-bottom: .2em;
+}
+
+/*** experimental floating properties
+div.box {
+    float: left;
+    padding: 1em;
+    margin: 1em;
+    border: 1px solid gray;
+}
+
+div.box h3 {
+    margin: 0;
+    text-align: center;
+}
+***/
+
+/* for experimental confirmation page */
+table.properties td {
+    border: 1px solid gray;
+}
+
+
+
+/* forms */
+
+fieldset {
+    margin: 1em;
+    padding: 1em;
+    clear: both;
+}
+
+form fieldset legend {
+    font-size: larger;
+}
+
+fieldset fieldset {
+    float: left;
+}
+
+fieldset fieldset legend {
+    font-size: normal;
+}
+
+form div {
+    padding-top: .2em;
+    padding-bottom: .2em;
+    clear: both;
+}
+
+form p {
+    clear: both;
+}
+
+.error {
+    font-weight: bold;
+    color: red;
+}
+
+form span.error {
+    margin: 0em .2em 1em 1em;
+    padding: .2em .2em .2em .2em;
+}
+
+.computed {
+    font-weight: bold;
+    background-color: #fcc;
+    border: thin solid red;
+}
+
+label.before {
+    font-weight: bold;
+    float: left;
+    text-align: right;
+    margin-right: 1ex;
+}
+
+.tab30ex label.before {
+    width: 30ex;
+}
+
+.tab30ex fieldset label.before {
+    /* account for the fieldset margin & padding */
+    width: 26ex;
+}
+
+.tab30ex label.after {
+    /*float: left;*/
+}
+
+.tab30ex .checkbox { margin-left: 30ex; }
+.tab30ex .radio { margin-left: 30ex; }
+
+.tab30ex fieldset .checkbox {
+    /* account for the fieldset margin & padding */
+    margin-left: 26ex;
+}
+
+.tab30ex fieldset .radio {
+    /* account for the fieldset margin & padding */
+    margin-left: 26ex;
+}
+
+.tab30ex fieldset fieldset .checkbox { margin-left: 0; }
+.tab30ex fieldset fieldset .radio { margin-left: 0; }
+
+.radio ul {
+    list-style: none;
+}
+
+label.before:after {
+    content: ":";
+}
+
+.tab30ex input.vIntegerField {
+    float: left;
+}
+
+.tab30ex input.vFloatField {
+    float: left;
+}
+
+.tab30ex input.vCheckboxField {
+    float: left;
+}
+
+.tab30ex select.vSelectField {
+    float: left;
+    margin-bottom: 1em;
+}
+
+input.reset {
+    float: right;
+}
+
+input.submit {
+    margin-top: 2em;
+    margin-bottom: 2em;
+}
+
+.tab30ex input.submit {
+    margin-left: 30ex;
+}
+
+
+/* events */
+
+#cmtsolutionIllustration {
+    width: 700px;
+}
+
+#sourceBeachballMw {
+    font-size: larger;
+}
+
+.cmtsolution pre {
+    border: 1px solid black;
+    padding: 1em;
+    background-color: #eee;
+}
+
+
+/* stations */
+
+#stations {
+    width: 576px;
+}
+
+
+
+/* misc. */
+
+.greek {
+    text-transform: none;
+}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/404.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/404.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/404.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,10 +1,4 @@
 
-{% extends "SeismoWebPortal/root.html" %}
-
-{% block body %}
-
 <p><a href="/specfem3dglobe/"><img id=logo src="/specfem3dglobe/pics/specfem3dg_logo.jpg" width=99 height=94>Home</a>
 
 <h1>Not Found</h1>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/500.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/500.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/500.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,10 +1,4 @@
 
-{% extends "SeismoWebPortal/root.html" %}
-
-{% block body %}
-
 <p><a href="/specfem3dglobe/"><img id=logo src="/specfem3dglobe/pics/specfem3dg_logo.jpg" width=99 height=94>Home</a>
 
 <h1>Internal Server Error</h1>
-
-{% endblock %}

Deleted: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/base.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/base.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/base.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,30 +0,0 @@
-
-{% extends "SeismoWebPortal/root.html" %}
-
-<!-- Django bug? -->
-{% block scripts %}
-{% endblock %}
-
-{% block body %}
-
-<div class=login>
-    <ul>
-       <li id=greeting>{% if user.is_anonymous %}Welcome.{% else %}Welcome, {{ user.first_name }} ({{ user.username }}).{% endif %}
-       <li><a href="/specfem3dglobe/logout/">logout</a>
-    </ul>
-</div>
-
-<div class=banner>
-    <div id=logos>
-        <a href="http://www.geodynamics.org/"><img id=ciglogo src="/specfem3dglobe/pics/cig-logo_small-initials.gif"></a>
-        <a href="/specfem3dglobe/"><img id=sflogo src="/specfem3dglobe/pics/specfem3dg_logo.jpg" width=99 height=94></a>
-    </div>
-    <h1><span id=sf3dg>SPECFEM&nbsp;3D&nbsp;GLOBE</span> <span id=webportal>Web&nbsp;Portal</span></h1>
-</div>
-
-<div class="messages {% if messages %}active{% endif %}">{% if messages %}{{ messages|join:" " }}{% else %}&nbsp;{% endif %}</div>
-
-{% block desktop %}
-{% endblock %}
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_confirm_delete.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_confirm_delete.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_confirm_delete.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,13 +1,7 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>delete event</h2>
 
-{% block content %}
-
-<h2 class=titlebar>delete event</h2>
-
 <form method="post" action="/specfem3dglobe/events/{{ object.id }}/delete/">
     <p>Are you sure you want to delete the event "{{ object }}"?
     <p><input type="submit" value="Delete" />
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,18 +1,7 @@
 
-{% extends "SeismoWebPortal/events.html" %}
+<h2>{{ object.name }}</h2>
 
-{% block content %}
-
-<h2 class=titlebar>{{ object.name }}</h2>
-
 <div class=toolbar>
-    {% if object.singleSource %}
-    <form action="edit/" method="get"><input type="submit" value="Edit..." /></form>
-    {% else %}
-    <form action="edit/" method="get"><input type="submit" value="Rename..." /></form>
-    {% endif %}
-
-    <form action="delete/" method="get"><input type="submit" value="Delete" /></form>
     <a href="gearth.kml"><img src="/specfem3dglobe/pics/kml.icon.gif" title="View in Google Earth" alt="View in Google Earth"></a>
     [<a href="CMTSOLUTION.txt">download as text</a>]
 </div>
@@ -66,5 +55,3 @@
 {% endif %}
 
 {% endif %}
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_form.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_form.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,10 +1,6 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>rename event</h2>
 
-{% block content %}
-
-<h2 class=titlebar>rename event</h2>
-
 {% if form.has_errors %}
 <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
 {% endif %}
@@ -24,5 +20,3 @@
     </div> <!-- tab30ex -->
 
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_list.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_list.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_list.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,16 +1,14 @@
 
-{% extends "SeismoWebPortal/events.html" %}
+<h2>events</h2>
 
-{% block content %}
-
 <div class=toolbar>
     <form action="search/" method="get"><input type="submit" value="Search..." /></form>
-    <form action="create/" method="get"><input type="submit" value="New..." /></form>
+    <form action="new/" method="get"><input type="submit" value="New..." /></form>
     <form action="upload/" method="get"><input type="submit" value="Upload..." /></form>
 </div>
 
 {% if object_list %}
-    <table rules=groups>
+    <table rules=groups class="cool">
         <colgroup><col class=odd><col class=even><col class=odd><col class=even><col class=odd><col class=even><col class=odd><col class=even></colgroup>
 
         <thead>
@@ -57,5 +55,3 @@
 {% else %}
     <p>You have no events.
 {% endif %}
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_search.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_search.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_search.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,10 +1,6 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>event search</h2>
 
-{% block content %}
-
-<h2 class=titlebar>event search</h2>
-
 {% if form.has_errors %}
 <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
 {% else %}
@@ -103,5 +99,3 @@
     </div>
 
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_search_results.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_search_results.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_search_results.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,12 +1,8 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>event search results</h2>
 
-{% block content %}
-
-<h2 class=titlebar>event search results</h2>
-
 {% if event_list %}
-    <table rules=groups>
+    <table rules=groups class="cool">
         <colgroup><col class=odd><col class=even><col class=odd><col class=even><col class=odd><col class=even><col class=odd></colgroup>
 
         <thead>
@@ -26,7 +22,7 @@
         <tr>
             <td>
                 <!-- an inline events/add form, already filled-out -->
-	        <form method="post" action="../create/">
+	        <form method="post" action="../new/">
 		    <input type="hidden" name="name"             value="{{ event.eventName }}"/>
 		    <input type="hidden" name="dataSource"       value="{{ event.dataSource }}"/>
 		    <input type="hidden" name="when_date"        value="{{ event.year }}-{{ event.month }}-{{ event.day }}"/>
@@ -69,5 +65,3 @@
 {% endif %}
 
 <p><a href="http://www.globalcmt.org/">Powered by the Global CMT Project.</a>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,10 +1,6 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>upload event</h2>
 
-{% block content %}
-
-<h2 class=titlebar>upload event</h2>
-
 <div class=toolbar>
     <form method="post" action="/specfem3dglobe/help/toggle/">
         <input type="hidden" name="post_toggle_redirect" value="/specfem3dglobe/events/upload/">
@@ -25,7 +21,7 @@
     <div class=tab30ex>
 
     <div>
-        <label for="id_name" class=before>name for this event</label></td>
+        <label for="id_name" class=before>name for this event</label>
         {{ form.name }}
         {% if form.name.errors %}<span class=error>{{ form.name.errors|join:", " }}</span>{% endif %}
     </div>
@@ -67,5 +63,3 @@
 </div>
 
 {% endif %}
-
-{% endblock %}

Deleted: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/events.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/events.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/events.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,20 +0,0 @@
-
-{% extends "SeismoWebPortal/base.html" %}
-
-{% block desktop %}
-
-<div class=taskbar>
-    <ul>
-        <li class=first><a href="/specfem3dglobe/">home</a>
-        <li><a href="/specfem3dglobe/objects/">objects</a>
-        <li class=selected><a href="/specfem3dglobe/events/">events</a>
-        <li><a href="/specfem3dglobe/registration/">profile</a>
-    </ul>
-</div>
-
-<h1 class=titlebar>events</h1>
-
-{% block content %}
-{% endblock %}
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/home.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/home.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/home.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,19 +1,6 @@
 
-{% extends "SeismoWebPortal/base.html" %}
+<h2>home</h2>
 
-{% block desktop %}
-
-<div class=taskbar>
-    <ul>
-        <li class="first selected"><a href="/specfem3dglobe/">home</a>
-        <li><a href="/specfem3dglobe/objects/">objects</a>
-        <li><a href="/specfem3dglobe/events/">events</a>
-        <li><a href="/specfem3dglobe/registration/">profile</a>
-    </ul>
-</div>
-
-<h1 class=titlebar>home</h1>
-
 <h3>quick start</h3>
 
 <p>To set up a new simulation, proceed as follows:
@@ -60,5 +47,3 @@
 
 <p><a href="/specfem3dglobe/doc/manual_SPECFEM3D_GLOBE.pdf">
    <img src="/specfem3dglobe/pics/adobe-pdf.icon.gif">SPECFEM 3D GLOBE User Manual</a>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mesh_confirm_delete.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mesh_confirm_delete.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mesh_confirm_delete.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,13 +1,7 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>delete mesh</h2>
 
-{% block content %}
-
-<h2 class=titlebar>delete mesh</h2>
-
-<form method="post" action="/specfem3dglobe/meshes/{{ object.id }}/delete/">
+<form method="post" action="/specfem3dglobe/config/specfem3dglobe/meshes/{{ object.id }}/delete/">
     <p>Are you sure you want to delete the mesh "{{ object }}"?
     <p><input type="submit" value="Delete" />
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mesh_form_base.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mesh_form_base.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mesh_form_base.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,10 +1,6 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>{% if object %}edit{% else %}new{% endif %} {% block heading %}{{ nchunks }}-chunk regional mesh{% endblock %}</h2>
 
-{% block content %}
-
-<h2 class=titlebar>{% if object %}edit{% else %}new{% endif %} {% block heading %}{{ nchunks }}-chunk regional mesh{% endblock %}</h2>
-
 <div class=toolbar>
     <form method="post" action="/specfem3dglobe/help/toggle/">
         <input type="hidden" name="post_toggle_redirect" value="{{ action }}">
@@ -14,11 +10,6 @@
         <input type="submit" name="show_help" value="Show Help" />
         {% endif %}
     </form>
-
-    {% if object %}
-    <form action="delete/" method="get"><input type="submit" value="Delete" /></form>
-    {% endif %}
-
 </div>
 
 <form name="mesh_form" method="post" action="{{ action }}">
@@ -139,5 +130,3 @@
     </div> <!-- tab30ex -->
 
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,10 +1,6 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>{% if object %}edit{% else %}new{% endif %} mode catalog</h2>
 
-{% block content %}
-
-<h2 class=titlebar>{% if object %}edit{% else %}new{% endif %} mode catalog</h2>
-
 <div class=toolbar>
     <form method="post" action="/specfem3dglobe/help/toggle/">
         <input type="hidden" name="post_toggle_redirect" value="{{ action }}">
@@ -84,5 +80,3 @@
     </div> <!-- tab30ex -->
 
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,10 +1,6 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>{% if object %}edit{% else %}new{% endif %} mineos parameters</h2>
 
-{% block content %}
-
-<h2 class=titlebar>{% if object %}edit{% else %}new{% endif %} mineos parameters</h2>
-
 <div class=toolbar>
     <form method="post" action="/specfem3dglobe/help/toggle/">
         <input type="hidden" name="post_toggle_redirect" value="{{ action }}">
@@ -14,11 +10,6 @@
         <input type="submit" name="show_help" value="Show Help" />
         {% endif %}
     </form>
-
-    {% if object %}
-    <form action="delete/" method="get"><input type="submit" value="Delete" /></form>
-    {% endif %}
-
 </div>
 
 <form method="post" action="{{ action }}">
@@ -98,5 +89,3 @@
     </div> <!-- tab30ex -->
 
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/model_confirm_delete.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/model_confirm_delete.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/model_confirm_delete.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,14 +1,7 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>delete model</h2>
 
-{% block content %}
-
-<h2 class=titlebar>delete model</h2>
-
-<form method="post" action="/specfem3dglobe/models/{{ object.id }}/delete/">
+<form method="post" action="/specfem3dglobe/config/specfem3dglobe/models/{{ object.id }}/delete/">
     <p>Are you sure you want to delete the model "{{ object }}"?
     <p><input type="submit" value="Delete" />
 </form>
-
-{% endblock %}
-

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/model_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/model_form.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/model_form.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,10 +1,6 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>{% if object %}edit{% else %}new{% endif %} model</h2>
 
-{% block content %}
-
-<h2 class=titlebar>{% if object %}edit{% else %}new{% endif %} model</h2>
-
 <div class=toolbar>
     <form method="post" action="/specfem3dglobe/help/toggle/">
         <input type="hidden" name="post_toggle_redirect" value="{{ action }}">
@@ -14,11 +10,6 @@
         <input type="submit" name="show_help" value="Show Help" />
         {% endif %}
     </form>
-
-    {% if object %}
-    <form action="delete/" method="get"><input type="submit" value="Delete" /></form>
-    {% endif %}
-
 </div>
 
 <form method="post" action="{{ action }}">
@@ -108,5 +99,3 @@
     </div> <!-- tab30ex -->
 
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/object_lists.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/object_lists.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/object_lists.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,30 +1,10 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>Configuration</h2>
 
-{% block content %}
-
-
-<div class=toolbar>
-    <form action="../simulations/create/" method="get"><input type="submit" value="New Simulation..." /></form>
-    <form action="mineos/modes/create/" method="get"><input type="submit" value="New Mode Catalog..." /></form>
-    <form action="mineos/parameters/create/" method="get"><input type="submit" value="Mineos..." /></form>
-    <form action="../stations/upload/" method="get"><input type="submit" value="Upload Station List..." /></form>
-    <form action="../meshes/create/" method="post">
-        <select name="nchunks" size="1">
-            <option value="1">regional with 1 chunk</option>
-            <option value="2">regional with 2 chunks</option>
-            <option value="3">regional with 3 chunks</option>
-            <option value="6" selected="selected">global (6 chunks)</option>
-        </select>
-        <input type="submit" value="New Mesh..." />
-    </form>
-    <form action="specfem3dglobe/models/create/" method="get"><input type="submit" value="New Model..." /></form>
-</div>
-
 <p>
-{% if simulation_list %}
-    <table rules=groups>
-        <caption>simulations</caption>
+{% if specfem3dglobe_parameters_list %}
+    <table rules=groups class="cool">
+        <caption>Specfem 3D Globe Parameter Sets</caption>
         
         <colgroup><col class=odd><col class=even><col class=odd><col class=even><col class=odd></colgroup>
 
@@ -33,27 +13,27 @@
         </thead>
         
         <tbody>
-        {% for sim in simulation_list %}
+        {% for object in specfem3dglobe_parameters_list %}
         <tr>
-            <th><a href="/specfem3dglobe/simulations/{{ sim.id }}/">{{ sim.name }}</a></th>
-            <td><a href="/specfem3dglobe/meshes/{{ sim.mesh.id }}/">{{ sim.mesh }}</a><br>
-                <span class=inlineInfo>shortest period &cong; {{ sim.mesh.shortestPeriod|stringformat:".0f" }}s</span></td>
-            <td><a href="specfem3dglobe/models/{{ sim.model.id }}/">{{ sim.model }}</a></td>
-            <td><a href="/specfem3dglobe/stations/{{ sim.stations.id }}/">{{ sim.stations }}</a></td>
-            <td>{{ sim.record_length }} minutes</td>
+            <th><a href="specfem3dglobe/parameters/{{ object.id }}/">{{ object.name }}</a></th>
+            <td><a href="specfem3dglobe/meshes/{{ object.mesh.id }}/">{{ object.mesh }}</a><br>
+                <span class=inlineInfo>shortest period &cong; {{ object.mesh.shortestPeriod|stringformat:".0f" }}s</span></td>
+            <td><a href="specfem3dglobe/models/{{ object.model.id }}/">{{ object.model }}</a></td>
+            <td><a href="stations/{{ object.stations.id }}/">{{ object.stations }}</a></td>
+            <td>{{ object.record_length }} minutes</td>
         </tr>
         {% endfor %}
         </tbody>
 
     </table>
 {% else %}
-    <p>You have no simulations.
+    <p>You have no Specfem 3D Globe parameter sets.
 {% endif %}
 
 
 <p>
 {% if mesh_list %}
-    <table border=1 rules=groups>
+    <table border=1 rules=groups class="cool">
         <caption>meshes</caption>
 
         <colgroup><col class=odd></colgroup>
@@ -97,7 +77,7 @@
         <tbody>
         {% for object in mesh_list %}
         <tr>
-            <th><a href="../meshes/{{ object.id }}/">{{ object.name }}</a></th>
+            <th><a href="specfem3dglobe/meshes/{{ object.id }}/">{{ object.name }}</a></th>
             <td class=int>{{ object.nchunks }}</td>
             <td class=int>{{ object.nproc_eta }}</td>
             <td class=int>{{ object.nproc_xi }}</td>
@@ -129,7 +109,7 @@
 
 <p>
 {% if model_list %}
-    <table rules=groups>
+    <table rules=groups class="cool">
         <caption>models</caption>
 
         <colgroup><col class=odd></colgroup>
@@ -172,7 +152,7 @@
 
 <p>
 {% if mode_catalog_list %}
-    <table rules=groups>
+    <table rules=groups class="cool">
         <caption>mode catalogs</caption>
 
         <thead>
@@ -186,6 +166,7 @@
             <th>wmax</th>
             <th>nmin</th>
             <th>nmax</th>
+            <th>max_depth</th>
         </tr>
         </thead>
 
@@ -201,6 +182,7 @@
             <td>{{ object.wmax }}</td>
             <td>{{ object.nmin }}</td>
             <td>{{ object.nmax }}</td>
+            <td>{{ object.max_depth }}</td>
         </tr>
         {% endfor %}
         </tbody>
@@ -213,8 +195,8 @@
 
 <p>
 {% if mineos_parameters_list %}
-    <table rules=groups>
-        <caption>mineos parameters</caption>
+    <table rules=groups class="cool">
+        <caption>Mineos Parameter Sets</caption>
 
         <thead>
         <tr>
@@ -248,13 +230,13 @@
 
     </table>
 {% else %}
-    <p>You have no Mineos parameters.
+    <p>You have no Mineos parameter sets.
 {% endif %}
 
 
 <p>
 {% if station_lists %}
-    <table border=0 rules=groups>
+    <table border=0 rules=groups class="cool">
         <caption>stations</caption>
 
         <colgroup><col class=odd><col class=even><col class=odd></colgroup>
@@ -270,11 +252,11 @@
         <tbody>
         {% for station_list in station_lists %}
         <tr>
-            <td><a href="../stations/{{ station_list.id }}/">{{ station_list.name }}</a></td>
+            <td><a href="stations/{{ station_list.id }}/">{{ station_list.name }}</a></td>
             <td>{{ station_list.station_set.count }}</td>
             <td>
-                <a href="../stations/{{ station_list.id }}/gearth.kml"><img src="/specfem3dglobe/pics/kml.icon.gif" title="View in Google Earth" alt="View in Google Earth"></a>
-                [<a href="../stations/{{ station_list.id }}/stations.txt">text</a>]
+                <a href="stations/{{ station_list.id }}/gearth.kml"><img src="/specfem3dglobe/pics/kml.icon.gif" title="View in Google Earth" alt="View in Google Earth"></a>
+                [<a href="stations/{{ station_list.id }}/stations.txt">text</a>]
             </td>
         </tr>
         {% endfor %}
@@ -284,6 +266,3 @@
 {% else %}
     <p>You have no stations.
 {% endif %}
-
-
-{% endblock %}

Deleted: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/objects.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/objects.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/objects.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,20 +0,0 @@
-
-{% extends "SeismoWebPortal/base.html" %}
-
-{% block desktop %}
-
-<div class=taskbar>
-    <ul>
-        <li class=first><a href="/specfem3dglobe/">home</a>
-        <li class=selected><a href="/specfem3dglobe/objects/">objects</a>
-        <li><a href="/specfem3dglobe/events/">events</a>
-        <li><a href="/specfem3dglobe/registration/">profile</a>
-    </ul>
-</div>
-
-<h1 class=titlebar>objects</h1>
-
-{% block content %}
-{% endblock %}
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/password_change_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/password_change_form.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/password_change_form.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,17 +1,6 @@
 
-{% extends "SeismoWebPortal/settings.html" %}
+<h1>change password</h1>
 
-{% block content %}
-
-<h1 class=titlebar>profile</h1>
-
-<div class=tabs>
-    <ul>
-        <li class=first><a href="/specfem3dglobe/registration/">registration</a>
-        <li class=selected><a href="/specfem3dglobe/registration/password/">password</a>
-    </ul>
-</div>
-
 {% if form.has_errors %}
 <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
 {% endif %}
@@ -42,5 +31,3 @@
     </div> <!-- tab30ex -->
 
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/register.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/register.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/register.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,22 +1,9 @@
 
-{% extends "SeismoWebPortal/root.html" %}
+<h2>new user registration</h2>
 
-{% block body %}
-
-<p><a href="/specfem3dglobe/"><img id=logo src="/specfem3dglobe/pics/specfem3dg_logo.jpg" width=99 height=94>Home</a>
-
-<h1 class=titlebar>new user registration</h1>
-
 <p>To create a new account, simply fill-out the form below.
 
 <p>If you've registered before, but have simply forgotten your username and/or password, try <a href="/specfem3dglobe/pwreset/">resetting your password</a>.
    If you need help, <a href="mailto:portal at geodynamics.org">contact us</a>.
 
 {% include "SeismoWebPortal/registration_form.html" %}
-
-<div class=illustration id=usermap>
-    <img src="/specfem3dglobe/pics/specfem_users_map.gif" width=461 height=230>
-    <p class=caption>SPECFEM User Map</p>
-</div>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/registration_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/registration_form.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/registration_form.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -6,7 +6,7 @@
 <form method="post" action="/specfem3dglobe/registration/">
     <div class=tab30ex>
 
-    {% if user.is_anonymous %}
+    {% if not desktop.user %}
     <fieldset><legend>username and password</legend>
 
     <div>
@@ -84,7 +84,7 @@
     </fieldset>
 
 
-    {% if user.is_anonymous %}
+    {% if not desktop.user %}
 
     <fieldset><legend>invitation</legend>
 
@@ -101,7 +101,7 @@
 
     {% endif %}
 
-    {% if user.is_anonymous %}
+    {% if not desktop.user %}
     <div><input class=submit type="submit" value="Register"/></div>
     {% else %}
     <div><input class=submit type="submit" value="Save"/></div>

Deleted: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/root.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/root.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/root.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,16 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<link href="/specfem3dglobe/css/style.css" type="text/css" rel="stylesheet" media="all" />
-<script type="text/javascript" language="javascript" src="/specfem3dglobe/jss/main.js"></script>
-<head>
-    <title>{% block title %}SPECFEM 3D GLOBE{% endblock %}</title>
-    {% block scripts %}
-    {% endblock %}
-</head>
-
-<body>
-{% block body %}
-{% endblock %}
-</body>
-</html>

Deleted: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/settings.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/settings.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/settings.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,18 +0,0 @@
-
-{% extends "SeismoWebPortal/base.html" %}
-
-{% block desktop %}
-
-<div class=taskbar>
-    <ul>
-        <li class=first><a href="/specfem3dglobe/">home</a>
-        <li><a href="/specfem3dglobe/objects/">objects</a>
-        <li><a href="/specfem3dglobe/events/">events</a>
-        <li class=selected><a href="/specfem3dglobe/registration/">profile</a>
-    </ul>
-</div>
-
-{% block content %}
-{% endblock %}
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/single_source_event_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/single_source_event_form.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/single_source_event_form.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,10 +1,6 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>{% if object %}edit{% else %}new{% endif %} event</h2>
 
-{% block content %}
-
-<h2 class=titlebar>{% if object %}edit{% else %}new{% endif %} event</h2>
-
 {% if form.has_errors %}
 <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
 {% endif %}
@@ -120,5 +116,3 @@
     </div> <!-- tab30ex -->
 
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/source_confirm_delete.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/source_confirm_delete.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/source_confirm_delete.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,13 +1,7 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>delete source</h2>
 
-{% block content %}
-
-<h2 class=titlebar>delete source</h2>
-
 <form method="post" action="/specfem3dglobe/events/sources/{{ object.id }}/delete/">
     <p>Are you sure you want to delete the source "{{ object }}"?
     <p><input type="submit" value="Delete" />
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/source_detail.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/source_detail.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/source_detail.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,13 +1,7 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>{{ object.eventName }}</h2>
 
-{% block content %}
-
-<h2 class=titlebar>{{ object.eventName }}</h2>
-
 <div class=toolbar>
-    <form action="edit/" method="get"><input type="submit" value="Edit..." /></form>
-    <form action="delete/" method="get"><input type="submit" value="Delete" /></form>
     [<a href="CMTSOLUTION.txt">download as text</a>]
 </div>
 
@@ -17,5 +11,3 @@
     <h3><code>CMTSOLUTION</code></h3>
     <pre>{{ object.cmtSolution }}</pre>
 </div>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/source_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/source_form.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/source_form.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,10 +1,6 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>edit source</h2>
 
-{% block content %}
-
-<h2 class=titlebar>edit source</h2>
-
 {% if form.has_errors %}
 <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
 {% endif %}
@@ -106,5 +102,3 @@
     </div> <!-- tab30ex -->
 
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_confirm_delete.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_confirm_delete.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_confirm_delete.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,13 +1,7 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>delete simulation</h2>
 
-{% block content %}
-
-<h2 class=titlebar>delete simulation</h2>
-
-<form method="post" action="/specfem3dglobe/simulations/{{ object.id }}/delete/">
+<form method="post" action="/specfem3dglobe/config/specfem3dglobe/parameters/{{ object.id }}/delete/">
     <p>Are you sure you want to delete the simulation "{{ object }}"?
     <p><input type="submit" value="Delete" />
 </form>
-{% endblock %}
-

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_detail.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_detail.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_detail.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,15 +1,6 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>{{ object.name }}</h2>
 
-{% block content %}
-
-<h2 class=titlebar>{{ object.name }}</h2>
-
-<div class=toolbar>
-    <form action="edit/" method="get"><input type="submit" value="Edit..." /></form>
-    <form action="delete/" method="get"><input type="submit" value="Delete" /></form>
-</div>
-
 <div class=properties>
 
     <div class=box>
@@ -35,7 +26,7 @@
     <h3>stations</h3>
 
     <dl>
-        <dt>station list</dt><dd><a href="../../stations/{{ object.stations.id }}/">{{ object.stations.name }}</a></dd>
+        <dt>station list</dt><dd><a href="../../../stations/{{ object.stations.id }}/">{{ object.stations.name }}</a></dd>
         <dt>receivers at depth</dt><dd>{{ object.receivers_can_be_buried }}</dd>
     </dl>
     </div>
@@ -52,5 +43,3 @@
     {% endif %}
 
 </div>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,10 +1,6 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>{% if object %}edit{% else %}new{% endif %} simulation</h2>
 
-{% block content %}
-
-<h2 class=titlebar>{% if object %}edit{% else %}new{% endif %} simulation</h2>
-
 <div class=toolbar>
     <form method="post" action="/specfem3dglobe/help/toggle/">
         <input type="hidden" name="post_toggle_redirect" value="{{ action }}">
@@ -14,11 +10,6 @@
         <input type="submit" name="show_help" value="Show Help" />
         {% endif %}
     </form>
-
-    {% if object %}
-    <form action="../delete/" method="get"><input type="submit" value="Delete" /></form>
-    {% endif %}
-
 </div>
 
 <form method="post" action="{{ action }}">
@@ -125,5 +116,3 @@
     </div> <!-- tab30ex -->
 
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/splash.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/splash.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/splash.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,8 +1,4 @@
 
-{% extends "SeismoWebPortal/root.html" %}
-
-{% block body %}
-
 <div class=splash>
 
     <div class=nameplate>
@@ -24,14 +20,6 @@
 
     <p><img src="/specfem3dglobe/pics/specfem3dg.jpg" width=393 height=374>
 
-<!--
-    <ul class=links>
-        <li><a href="about.html">about</a>
-        <li><a href="science.html">science</a>
-        <li class=last><a href="links.html">links</a>
-    </ul>
--->
-
     <p id=sponsored>Sponsored by:</p>
     <ul class=sponsors>
         <li><a href="http://www.geodynamics.org/"><img src="/specfem3dglobe/pics/cig-logo_small-initials.gif"></a>
@@ -42,5 +30,3 @@
     </ul>
 
 </div> <!-- splash -->
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_confirm_delete.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_confirm_delete.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_confirm_delete.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,13 +1,7 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>delete station list</h2>
 
-{% block content %}
-
-<h2 class=titlebar>delete station list</h2>
-
-<form method="post" action="/specfem3dglobe/stations/{{ object.id }}/delete/">
+<form method="post" action="/specfem3dglobe/config/stations/{{ object.id }}/delete/">
     <p>Are you sure you want to delete the station list "{{ object }}"?
     <p><input type="submit" value="Delete" />
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_detail.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_detail.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_detail.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,13 +1,7 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>{{ object.name }}</h2>
 
-{% block content %}
-
-<h2 class=titlebar>{{ object.name }}</h2>
-
 <div class=toolbar>
-    <form action="edit/" method="get"><input type="submit" value="Rename..." /></form>
-    <form action="delete/" method="get"><input type="submit" value="Delete" /></form>
     <a href="gearth.kml"><img src="/specfem3dglobe/pics/kml.icon.gif" title="View in Google Earth" alt="View in Google Earth"></a>
     [<a href="stations.txt">download as text</a>]
 </div>
@@ -15,7 +9,7 @@
 <p class=infobar>{{ object.station_set.count }} station{{ object.station_set.count|pluralize }}
 
 {% if object.station_set.count %}
-    <table rules=groups>
+    <table rules=groups class="cool">
         <colgroup><col class=odd></colgroup>
         <colgroup><col class=even><col class=odd></colgroup>
         <colgroup><col class=even><col class=odd></colgroup>
@@ -44,5 +38,3 @@
 
     </table>
 {% endif %}
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_form.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_form.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,15 +1,11 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>edit station list</h2>
 
-{% block content %}
-
-<h2 class=titlebar>rename station list</h2>
-
 {% if form.has_errors %}
 <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
 {% endif %}
 
-<form method="post" action="/specfem3dglobe/stations/{{ object.id }}/edit/">
+<form method="post" action="/specfem3dglobe/config/stations/{{ object.id }}/edit/">
 
     <div class=tab30ex>
 
@@ -26,5 +22,3 @@
     </div> <!-- tab30ex -->
 
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,13 +1,9 @@
 
-{% extends "SeismoWebPortal/objects.html" %}
+<h2>upload station list</h2>
 
-{% block content %}
-
-<h2 class=titlebar>upload station list</h2>
-
 <div class=toolbar>
     <form method="post" action="/specfem3dglobe/help/toggle/">
-        <input type="hidden" name="post_toggle_redirect" value="/specfem3dglobe/stations/upload/">
+        <input type="hidden" name="post_toggle_redirect" value="/specfem3dglobe/config/stations/upload/">
         {% if help_visible %}
         <input type="submit" name="hide_help" value="Hide Help" />
         {% else %}
@@ -16,7 +12,7 @@
     </form>
 </div>
 
-<form action="/specfem3dglobe/stations/upload/" method="POST" enctype="multipart/form-data">
+<form action="/specfem3dglobe/config/stations/upload/" method="POST" enctype="multipart/form-data">
 
     {% if form.has_errors %}
     <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
@@ -88,5 +84,3 @@
 </div>
 
 {% endif %}
-
-{% endblock %}

Added: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/user_map.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/user_map.html	                        (rev 0)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/user_map.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -0,0 +1,5 @@
+
+<div class=illustration id=usermap>
+    <img src="/specfem3dglobe/pics/specfem_users_map.gif" width=461 height=230>
+    <p class=caption>SPECFEM User Map</p>
+</div>

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/userinfo_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/userinfo_form.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/userinfo_form.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,17 +1,5 @@
 
-{% extends "SeismoWebPortal/settings.html" %}
+<h1>profile</h1>
 
-{% block content %}
 
-<h1 class=titlebar>profile</h1>
-
-<div class=tabs>
-    <ul>
-        <li class="selected first"><a href="/specfem3dglobe/registration/">registration</a>
-        <li><a href="/specfem3dglobe/registration/password/">password</a>
-    </ul>
-</div>
-
 {% include "SeismoWebPortal/registration_form.html" %}
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/registration/login.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/registration/login.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/registration/login.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,8 +1,4 @@
 
-{% extends "SeismoWebPortal/root.html" %}
-
-{% block body %}
-
 <p><a href="/specfem3dglobe/"><img id=logo src="/specfem3dglobe/pics/specfem3dg_logo.jpg" width=99 height=94>Home</a>
 
 <h1 class=titlebar>login</h1>
@@ -53,5 +49,3 @@
 <p>If you've forgotten your username and/or password, try <a href="/specfem3dglobe/pwreset/">resetting your password</a>.
 
 <p>If you need help, <a href="mailto:portal at geodynamics.org">contact us</a>.
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/registration/pwreset.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/registration/pwreset.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/registration/pwreset.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,11 +1,7 @@
 
-{% extends "SeismoWebPortal/root.html" %}
-
-{% block body %}
-
 <p><a href="/specfem3dglobe/"><img id=logo src="/specfem3dglobe/pics/specfem3dg_logo.jpg" width=99 height=94>Home</a>
 
-<h1 class=titlebar>password reset</h1>
+<h1>password reset</h1>
 
 <p>Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you.</p>
 
@@ -27,5 +23,3 @@
     </div> <!-- tab30ex -->
 
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/registration/pwreset_done.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/registration/pwreset_done.html	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/registration/pwreset_done.html	2008-03-22 03:37:05 UTC (rev 11498)
@@ -1,14 +1,8 @@
 
-{% extends "SeismoWebPortal/root.html" %}
-
-{% block body %}
-
 <p><a href="/specfem3dglobe/"><img id=logo src="/specfem3dglobe/pics/specfem3dg_logo.jpg" width=99 height=94>Home</a>
 
-<h1 class=titlebar>password reset</h1>
+<h1>password reset</h1>
 
 <p><b>Success!</b> We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly.</p>
 
 <p><a href="/specfem3dglobe/login/">Login</a></p>
-
-{% endblock %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/views.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/views.py	2008-03-21 06:12:19 UTC (rev 11497)
+++ cs/portal/trunk/seismo/SeismoWebPortal/views.py	2008-03-22 03:37:05 UTC (rev 11498)
@@ -6,6 +6,7 @@
 from django.core import validators
 from django.http import HttpResponse, HttpResponseRedirect, Http404
 from django.shortcuts import render_to_response, get_object_or_404
+from django.template import loader
 from django.template.context import RequestContext
 from create_update import create_object, update_object
 from forms import RegistrationAddManipulator, RegistrationChangeManipulator
@@ -13,6 +14,7 @@
 from models import MineosModeCatalog, MineosParameters
 from models import Run, Job, OutputFile
 from cmt import CMTSolution
+import gui
 
 import os, os.path
 from HTMLParser import HTMLParser
@@ -52,17 +54,31 @@
 
 def root(request, pathname):
     from django.views.static import serve as staticServe
-    
+
+    desktop = gui.Desktop("/specfem3dglobe", "CIG Seismology Web Portal")
+    if not request.user.is_anonymous():
+        desktop.user = request.user
+    homeFile = gui.File("", "Home")
+    navtree = gui.Directory("home", "Home", [
+        homeFile, 
+        gui.Directory("events", "Events", []),
+        gui.Directory("config", "Configuration", []),
+        ])
+    fileBrowser = gui.FileBrowser("/specfem3dglobe/", "Home", navtree)
+    desktop.insertWindow(fileBrowser)
+    desktop.selectWindow(fileBrowser)
+
     path = pathname.split('/')
     if path[-1] == "":
         path.pop()
 
     if not path:
-        return home(request)
+        fileBrowser.path.append(homeFile)
+        return httpResponse(home(request, desktop))
 
     name = path.pop(0)
 
-    static = lambda request, path: staticServe(request, pathname, document_root = static_media_root)
+    static = lambda request, path, desktop: staticServe(request, pathname, document_root = static_media_root)
 
     index = Index({
         "login": login,
@@ -79,7 +95,7 @@
 
     publicView = index.get(name)
     if publicView:
-        return publicView(request, path)
+        return httpResponse(publicView(request, path, desktop))
 
     # Login is required for everything beyond this point.
     if request.user.is_anonymous():
@@ -89,18 +105,30 @@
                                     (REDIRECT_FIELD_NAME, quote(request.get_full_path())))
 
     index = Index({
-        "objects": objects,
-        "meshes": meshes,
-        "simulations": simulations,
+        "config": config,
         "events": events,
-        "stations": stations,
+        "profile": registration,
         "logout": logout,
         "help": help,
         })
 
-    return index[name](request, path)
+    return httpResponse(index[name](request, path, desktop))
 
 
+def httpResponse(response):
+    # "Cast" the argument, 'response', to an HttpResponse.
+    
+    if isinstance(response, HttpResponse):
+        return response
+    
+    import designs.plone
+    design = designs.plone.PloneDesign()
+    response = HttpResponse(content = str(design.renderAsDocument(response)),
+                            mimetype = "text/html")
+    return response
+
+
+
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Meshes, Models, Simulations
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -110,64 +138,147 @@
 disapproval = "You cannot run simulations until you are approved by a site administrator."
 
 
-def home(request):
+def home(request, desktop):
     if request.user.is_anonymous():
         return render_to_response('SeismoWebPortal/splash.html', {},
                                   RequestContext(request, {}))
-    return render_to_response('SeismoWebPortal/home.html',
-                              {},
-                              RequestContext(request, {}))
 
+    child = gui.ChildWindow("/specfem3dglobe/", "View")
+    child.content = gui.StaticContent(loader.render_to_string('SeismoWebPortal/home.html'))
+    desktop.activeWindow.selectWindow(child)
+    return desktop
 
-def objects(request, path):
-    from django.views.generic.create_update import delete_object
 
+def config(request, path, desktop):
+    from create_update import delete_object
+
+    fileBrowser = desktop.windowList[0]
+    configDir = fileBrowser.root.index["config"]
+    fileBrowser.path.append(configDir)
+
     if path:
         name = path.pop(0)
+        if name == "stations":
+            return config_stations(request, path, desktop)
         index = Index({
-            "specfem3dglobe": {"models": Model},
-            "mineos": {"modes": MineosModeCatalog, "parameters": MineosParameters},
+            "specfem3dglobe": Index({"models": Model,
+                                     "meshes": [config_specfem3dglobe_meshes],
+                                     "parameters": [config_specfem3dglobe_parameters] }),
+            "mineos": Index({"modes": MineosModeCatalog,
+                             "parameters": MineosParameters}),
             })
         index = index[name]
+        url = name
         name = path.pop(0)
-        ModelClass = index[name]
+        handler = index[name]
+        if isinstance(handler, list):
+            return handler[0](request, path, desktop)
+        else:
+            ModelClass = handler
+        url += "/" + name
         name = path.pop(0)
-        if name == "create":
+        if name == "new":
             if path: raise Http404
-            return create(request, ModelClass = ModelClass)
+            url = "/specfem3dglobe/config/%s/new/" % url
+            window = gui.ChildWindow(url, "New")
+            return create(request, desktop, window, ModelClass)
+        
         objId = intOr404(name)
+        url = "/specfem3dglobe/config/%s/%d/" % (url, objId)
+
+        view = gui.ChildWindow(url, "View")
+        edit = gui.ChildWindow(url + "edit/", "Edit")
+        menuBar = [
+            gui.Menu("actionMenu", "actions", "Actions",
+                     [gui.MenuItem(url + "duplicate/", "Duplicate"),
+                      gui.MenuItem(url + "delete/", "Delete"),
+                      ]
+                     ),
+            ]
+        view.menuBar = edit.menuBar = menuBar
+        desktop.activeWindow.insertWindow(view)
+        desktop.activeWindow.insertWindow(edit)
+    
         if not path:
-            return update(request, object_id = objId, ModelClass = ModelClass)
+            return update(request, desktop, view, object_id = objId, ModelClass = ModelClass)
         name = path.pop(0)
+        if path: raise Http404
+        if name == "edit":
+            return update(request, desktop, edit, object_id = objId, ModelClass = ModelClass)
         if name == "delete":
-            if path: raise Http404
             return delete_object(request,
+                                 desktop,
+                                 ModelClass,
+                                 "/specfem3dglobe/config/",
                                  object_id = objId,
-                                 model = ModelClass,
-                                 post_delete_redirect = "/specfem3dglobe/objects/")
+                                 )
         raise Http404
 
-    return render_to_response('SeismoWebPortal/object_lists.html',
-                              {'simulation_list': Simulation.objects.filter(user=request.user),
-                               'mesh_list': Mesh.user_objects.all(),
-                               'model_list': Model.user_objects.all(),
-                               'mode_catalog_list': MineosModeCatalog.objects.all(),
-                               'mineos_parameters_list': MineosParameters.objects.all(),
-                               'station_lists': StationList.objects.filter(user__exact=request.user),
-                               },
-                              RequestContext(request, {}))
+    child = gui.ChildWindow("/specfem3dglobe/config/", "View")
+    child.menuBar = [
+        gui.Menu("newMenu", "new", "New",
+                 [gui.MenuItem("specfem3dglobe/models/new/", "Specfem 3D Globe Model"),
+                  gui.MenuItem("specfem3dglobe/meshes/new/1/", "Specfem 3D Globe 1-chunk Regional Mesh"),
+                  gui.MenuItem("specfem3dglobe/meshes/new/2/", "Specfem 3D Globe 2-chunk Regional Mesh"),
+                  gui.MenuItem("specfem3dglobe/meshes/new/3/", "Specfem 3D Globe 3-chunk Regional Mesh"),
+                  gui.MenuItem("specfem3dglobe/meshes/new/6/", "Specfem 3D Globe Global Mesh"),
+                  gui.MenuItem("specfem3dglobe/parameters/new/", "Specfem 3D Globe Parameter Set"),
+                  gui.MenuItem("mineos/modes/new/", "Mineos Mode Catalog"),
+                  gui.MenuItem("mineos/parameters/new/", "Mineos Parameter Set"),
+                  ]
+                 ),
+        gui.Menu("uploadMenu", "upload", "Upload",
+                 [gui.MenuItem("stations/upload/", "Station List"),
+                 ]
+                 )
+        ]
+    html = loader.render_to_string('SeismoWebPortal/object_lists.html',
+                                   {'specfem3dglobe_parameters_list': Simulation.objects.filter(user=request.user),
+                                    'mesh_list': Mesh.user_objects.all(),
+                                    'model_list': Model.user_objects.all(),
+                                    'mode_catalog_list': MineosModeCatalog.objects.all(),
+                                    'mineos_parameters_list': MineosParameters.objects.all(),
+                                    'station_lists': StationList.objects.filter(user__exact=request.user),
+                                    }
+                                   )
+    child.content = gui.StaticContent(html)
+    desktop.activeWindow.selectWindow(child)
+    return desktop
+    
 
 
-def simulations(request, path):
-    from django.views.generic.create_update import delete_object
+def config_specfem3dglobe_parameters(request, path, desktop):
+    from create_update import delete_object
+    from list_detail import object_detail
     
     name = path.pop(0)
-    if name == "create":
-        return create_simulation(request)
+    if name == "new":
+        window = gui.ChildWindow("/specfem3dglobe/config/specfem3dglobe/parameters/new/", "New")
+        return create_object(request,
+                             desktop,
+                             window,
+                             Simulation,
+                             post_save_redirect = '/specfem3dglobe/config/specfem3dglobe/parameters/%(id)d/',
+                             follow = { 'user': False },
+                             )
     
     objId = intOr404(name)
+    url = "/specfem3dglobe/config/specfem3dglobe/parameters/%d/" % objId
+    
+    view = gui.ChildWindow(url, "View")
+    edit = gui.ChildWindow(url + "edit/", "Edit")
+    menuBar = [
+        gui.Menu("actionMenu", "actions", "Actions",
+                 [gui.MenuItem(url + "delete/", "Delete"),
+                  ]
+                 ),
+        ]
+    view.menuBar = edit.menuBar = menuBar
+    desktop.activeWindow.insertWindow(view)
+    desktop.activeWindow.insertWindow(edit)
+    
     if not path:
-        return simulation_detail(request, object_id = objId)
+        return object_detail(request, desktop, view, Simulation.user_objects.all(), object_id = objId)
     
     name = path.pop(0)
             
@@ -182,86 +293,35 @@
         return index[name](request, sim_id = objId)
     
     if path: raise Http404
+
+    if name == "edit":
+        return update_object(request,
+                             desktop,
+                             edit,
+                             Specfem3DGlobeParameters,
+                             object_id = objId,
+                             post_save_redirect = url,
+                             follow = { 'user': False },
+                             )
+    if name == "delete":
+        return delete_object(request,
+                             desktop,
+                             Specfem3DGlobeParameters,
+                             post_delete_redirect = "/specfem3dglobe/config/",
+                             object_id = objId)
     
     index = Index({
-        "edit": (update_simulation, (), dict(object_id = objId)),
-        "delete": (delete_object, (), dict(object_id = objId,
-                                           model = Specfem3DGlobeParameters,
-                                           post_delete_redirect = "/specfem3dglobe/objects/")),
-        "run": (run_simulation, (), dict(object_id = objId)),
-        "par_file.txt": (par_file, (), dict(sim_id = objId)),
-        "parameters.pml": (parameters_pml, (), dict(sim_id = objId)),
-        "stations.txt": (stations_txt, (), dict(sim_id = objId)),
-        "events.txt": (events_txt, (), dict(sim_id = objId)),
+        "par_file.txt": par_file,
+        "parameters.pml": parameters_pml,
+        "stations.txt": stations_txt,
+        "events.txt": events_txt,
         })
-    view, args, kwds = index[name]
-    return view(request, *args, **kwds)
+    view = index[name]
+    return view(request, sim_id = objId)
 
 
-
-def create_simulation(request):
-    def post_save(object):
-        user = request.user
-        if request.POST.has_key('save_and_run'):
-            if user.userinfo.approved:
-                object.run()
-            else:
-                user.message_set.create(message=disapproval)
-        return None
-    return create_object(request,
-                         Simulation,
-                         post_save_redirect = '/specfem3dglobe/simulations/%(id)d/',
-                         follow = { 'user': False },
-                         post_save_hook=post_save,
-                         )
-
-
-def update_simulation(request, object_id):
-    def post_save(object):
-        user = request.user
-        if request.POST.has_key('save_and_run'):
-            if user.userinfo.approved:
-                object.run()
-            else:
-                user.message_set.create(message=disapproval)
-        return None
-    return update_object(request,
-                         Simulation,
-                         object_id,
-                         post_save_redirect = '/specfem3dglobe/simulations/%(id)d/',
-                         follow = { 'user': False },
-                         post_save_hook=post_save,
-                         )
-
-
-def run_simulation(request, object_id):
-    from django.views.generic.list_detail import object_detail
-    
-    user = request.user
-    object_id = int(object_id)
-    
-    if not user.userinfo.approved:
-        user.message_set.create(message=disapproval)
-        return HttpResponseRedirect('/specfem3dglobe/simulations/%d/' % object_id)
-    
-    simulation = get_object_or_404(Simulation, id=object_id)
-    
-    if request.method == 'POST':
-        run = simulation.run()
-        user.message_set.create(message="A new run has been started.")
-        return HttpResponseRedirect('/specfem3dglobe/simulations/%d/' % object_id)
-
-    raise Http404
-
-
-
-def simulation_detail(request, object_id):
-    from django.views.generic.list_detail import object_detail
-    return object_detail(request, Simulation.user_objects.all(), object_id)
-
-
 def par_file(request, sim_id):
-    from django.template import loader, Context
+    from django.template import Context
 
     response = HttpResponse(mimetype='text/plain')
     #response['Content-Disposition'] = 'attachment; filename=parameters.xml'
@@ -276,7 +336,7 @@
     return response
 
 def parameters_pml(request, sim_id):
-    from django.template import loader, Context
+    from django.template import Context
 
     response = HttpResponse(mimetype='text/xml')
     #response['Content-Disposition'] = 'attachment; filename=parameters.xml'
@@ -290,7 +350,7 @@
     response.write(t.render(c))
     return response
 
-def login(request, path, template_name='registration/login.html'):
+def login(request, path, desktop, template_name='registration/login.html'):
     from django.contrib.auth import login as loginUser
     "Displays the login form and handles the login action."
     from django.contrib.auth.forms import AuthenticationForm
@@ -322,7 +382,7 @@
         'site_name': Site.objects.get_current().name,
     }, context_instance=RequestContext(request))
 
-def logout(request, path):
+def logout(request, path, desktop):
     from django.contrib.auth import logout as logoutUser
     
     if path: raise Http404
@@ -330,7 +390,7 @@
     logoutUser(request)
     return HttpResponseRedirect('/specfem3dglobe/login/')
 
-def pwreset(request, path):
+def pwreset(request, path, desktop):
     from django.views.generic.simple import direct_to_template
     from django.contrib.auth.forms import PasswordResetForm
     
@@ -409,7 +469,7 @@
     return response
 
 
-def runs(request, path):
+def runs(request, path, desktop):
     from django.views.generic.list_detail import object_list
     
     if not path:
@@ -520,10 +580,10 @@
     return
 
 
-def jobs(request, path):
+def jobs(request, path, desktop):
     return daemon_post(request, path, Job, "SeismoWebPortal/job_form.html")
 
-def output(request, path):
+def output(request, path, desktop):
     return daemon_post(request, path, OutputFile, "SeismoWebPortal/outputfile_form.html")
 
 def daemon_post(request, path, Model, template):
@@ -559,21 +619,46 @@
                               {'form': form, 'action': request.path},
                               RequestContext(request, {}))
 
-def registration(request, path):
+
+def profileWindows(desktop):
+    profile = gui.ChildWindow("/specfem3dglobe/profile/", "Profile")
+    password = gui.ChildWindow("/specfem3dglobe/profile/password/", "Password")
+    desktop.activeWindow.insertWindow(profile)
+    desktop.activeWindow.insertWindow(password)
+    return profile, password
+
+
+def registerWindows(desktop):
+    register = gui.ChildWindow("/specfem3dglobe/registration/", "Register")
+    map = gui.ChildWindow("/specfem3dglobe/registration/map/", "Map")
+    desktop.activeWindow.insertWindow(register)
+    desktop.activeWindow.insertWindow(map)
+    return register, map
+
+
+def registration(request, path, desktop):
     if path:
         name = path.pop(0)
         if path: raise Http404
+        if name == "map":
+            _, window = registerWindows(desktop)
+            html = loader.render_to_string('SeismoWebPortal/user_map.html')
+            window.content = gui.StaticContent(html)
+            desktop.activeWindow.selectWindow(window)
+            return desktop
         if name == "password":
-            return password_change(request, template_name = "SeismoWebPortal/password_change_form.html")
+            return password_change(request, desktop, template_name = "SeismoWebPortal/password_change_form.html")
         raise Http404
 
     isNewUser = request.user.is_anonymous()
     if isNewUser:
         manipulator = RegistrationAddManipulator(request)
         template = 'SeismoWebPortal/register.html'
+        window, _ = registerWindows(desktop)
     else:
         manipulator = RegistrationChangeManipulator(request.user)
         template = 'SeismoWebPortal/userinfo_form.html'
+        window, _ = profileWindows(desktop)
 
     if request.method == 'POST':
         new_data = request.POST.copy()
@@ -585,7 +670,7 @@
                 if isNewUser:
                     request.session.delete_test_cookie()
                     help_login_hook(request, user)
-                    set_up_user_defaults(user)
+                    #set_up_user_defaults(user)
                     notify_managers_of_new_user(request, user)
                     user.message_set.create(message="Welcome to the SPECFEM 3D GLOBE web portal!")
                 else:
@@ -602,7 +687,10 @@
     # Populate the FormWrapper.
     form = forms.FormWrapper(manipulator, new_data, errors, edit_inline = True)
     
-    return render_to_response(template, { 'form': form }, RequestContext(request, {}))
+    html = loader.render_to_string(template, { 'form': form, 'desktop': desktop })
+    window.content = gui.StaticContent(html)
+    desktop.activeWindow.selectWindow(window)
+    return desktop
 
 
 def set_up_user_defaults(newUser):
@@ -673,7 +761,7 @@
     return
 
 
-def password_change(request, template_name='registration/password_change_form.html'):
+def password_change(request, desktop, template_name='registration/password_change_form.html'):
     from django.contrib.auth.forms import PasswordResetForm, PasswordChangeForm
 
     new_data, errors = {}, {}
@@ -685,52 +773,62 @@
             form.save(new_data)
             request.user.message_set.create(message="Your password has been changed.")
             return HttpResponseRedirect('/specfem3dglobe/')
-    return render_to_response(template_name, {'form': forms.FormWrapper(form, new_data, errors)},
-        context_instance=RequestContext(request))
+        
+    _, window = profileWindows(desktop)
+    html = loader.render_to_string(template_name, { 'form': forms.FormWrapper(form, new_data, errors) })
+    window.content = gui.StaticContent(html)
+    desktop.activeWindow.selectWindow(window)
+    return desktop
 
 
-def meshes(request, path):
-    from django.views.generic.create_update import delete_object
+def config_specfem3dglobe_meshes(request, path, desktop):
+    from create_update import delete_object
     
     if not path:
         raise Http404
     
     name = path.pop(0)
     
-    if name == "create":
-        if not path:
-            return create_mesh(request)
+    if name == "new":
+        if not path: raise Http404
         name = path.pop(0)
         nchunks = intOr404(name)
         if path: raise Http404
-        return manipulate_mesh(request, nchunks = nchunks, action='create')
+        window = gui.ChildWindow("/specfem3dglobe/config/specfem3dglobe/meshes/new/%d/" % nchunks, "New")
+        return manipulate_mesh(request, desktop, window, nchunks = nchunks, action='new')
     
     objId = intOr404(name)
+    url = "/specfem3dglobe/config/specfem3dglobe/meshes/%d/" % objId
+    
+    view = gui.ChildWindow(url, "View")
+    edit = gui.ChildWindow(url + "edit/", "Edit")
+    menuBar = [
+        gui.Menu("actionMenu", "actions", "Actions",
+                 [gui.MenuItem(url + "delete/", "Delete"),
+                  ]
+                 ),
+        ]
+    view.menuBar = edit.menuBar = menuBar
+    desktop.activeWindow.insertWindow(view)
+    desktop.activeWindow.insertWindow(edit)
+    
     if not path:
-        return manipulate_mesh(request, object_id = objId, action='edit')
+        return manipulate_mesh(request, desktop, view, object_id = objId, action='edit')
     name = path.pop(0)
+    if name == "edit":
+        return manipulate_mesh(request, desktop, edit, object_id = objId, action='edit')
     if name == "delete":
         if path: raise Http404
         return delete_object(request,
-                             object_id = objId,
-                             model = Mesh,
-                             post_delete_redirect = "/specfem3dglobe/objects/")
+                             desktop,
+                             Mesh,
+                             "/specfem3dglobe/config/",
+                             object_id = objId)
 
     raise Http404
 
 
-def create_mesh(request):
-
-    if request.method != 'POST':
-        return HttpResponseRedirect('/specfem3dglobe/meshes/')
-        
-    nchunks = int(request.POST['nchunks'])
-    return HttpResponseRedirect('/specfem3dglobe/meshes/create/%d/' % nchunks)
-
-
-
-
-def manipulate_mesh(request, action=None, nchunks=None, object_id=None):
+def manipulate_mesh(request, desktop, window, action=None, nchunks=None, object_id=None):
     from forms import MeshAddManipulator, MeshChangeManipulator
     
     if nchunks is None:
@@ -740,7 +838,7 @@
         mesh = None
         nchunks = int(nchunks)
     
-    if action == "create":
+    if action == "new":
         manipulator = MeshAddManipulator(nchunks)
     elif action == "edit":
         manipulator = MeshChangeManipulator(nchunks, object_id)
@@ -775,7 +873,7 @@
                 manipulator.do_html2python(new_data)
                 manipulator.save(new_data)
                 if not errors:
-                    return HttpResponseRedirect('/specfem3dglobe/objects/')
+                    return HttpResponseRedirect('/specfem3dglobe/config/')
     else:
         # Populate new_data with a 'flattened' version of the current data.
         new_data = manipulator.flatten_data()
@@ -784,35 +882,41 @@
     # Populate the FormWrapper.
     form = forms.FormWrapper(manipulator, new_data, errors, edit_inline = True)
     
-    return render_to_response(template,
-                              { 'form': form,
-                                'nchunks': nchunks,
-                                'help_visible': help_visible,
-                                'object': mesh,
-                                'action': request.path,
-                                },
-                              RequestContext(request, {}))
+    html = loader.render_to_string(template,
+                                   { 'form': form,
+                                     'nchunks': nchunks,
+                                     'help_visible': help_visible,
+                                     'object': mesh,
+                                     'action': request.path,
+                                     }
+                                   )
+    window.content = gui.StaticContent(html)
+    desktop.activeWindow.selectWindow(window)
+    return desktop
 
 
-
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # generic
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-def create(request, ModelClass):
+def create(request, desktop, window, ModelClass):
     return create_object(request,
+                         desktop,
+                         window,
                          ModelClass,
-                         post_save_redirect = '/specfem3dglobe/objects/',
+                         post_save_redirect = '/specfem3dglobe/config/',
                          follow = { 'user': False },
                          )
 
 
-def update(request, object_id, ModelClass):
+def update(request, desktop, window, object_id, ModelClass):
     return update_object(request,
+                         desktop,
+                         window,
                          ModelClass,
                          object_id,
-                         post_save_redirect = '/specfem3dglobe/objects/',
+                         post_save_redirect = '/specfem3dglobe/config/',
                          follow = { 'user': False },
                          )
 
@@ -822,29 +926,53 @@
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-def events(request, path):
+def events(request, path, desktop):
     from models import Event
-    from django.views.generic.list_detail import object_list, object_detail
-    from django.views.generic.create_update import delete_object
+    from list_detail import object_list, object_detail
+    from create_update import delete_object
+
+    fileBrowser = desktop.windowList[0]
+    eventsDir = fileBrowser.root.index["events"]
+    fileBrowser.path.append(eventsDir)
     
     if not path:
-        return object_list(request, queryset = Event.user_objects.all(), allow_empty = True)
+        view = gui.ChildWindow("/specfem3dglobe/events/", "View")
+        return object_list(request, desktop, view, queryset = Event.user_objects.all(), allow_empty = True)
 
     name = path.pop(0)
     index = Index({
         "search": event_search,
-        "create": lambda request, path: manipulate_event(request, path, action='create'),
+        "new": lambda request, path, desktop: manipulate_event(request, path, desktop, action='new'),
         "upload": upload_event,
         "sources": sources,
         })
     view = index.get(name)
     if view:
-        return view(request, path)
+        return view(request, path, desktop)
 
     objId = intOr404(name)
+    url = "/specfem3dglobe/events/%d/" % objId
+    node = gui.File(name, get_object_or_404(Event, id=objId, user__exact=request.user).name) # Ouch!
+    eventsDir.appendNode(node)
+    fileBrowser.path.append(node)
+    
+    view = gui.ChildWindow(url, "View")
+    edit = gui.ChildWindow(url + "edit/", "Edit")
+    menuBar = [
+        gui.Menu("actionMenu", "actions", "Actions",
+                 [gui.MenuItem(url + "delete/", "Delete"),
+                  ]
+                 ),
+        ]
+    view.menuBar = edit.menuBar = menuBar
+    desktop.activeWindow.insertWindow(view)
+    desktop.activeWindow.insertWindow(edit)
+    
     if not path:
         return object_detail(
             request,
+            desktop,
+            view,
             object_id = objId,
             queryset = Event.user_objects.all(),
             extra_context = { 'object_list': Event.user_objects.all() },
@@ -852,12 +980,13 @@
 
     name = path.pop(0)
     if name == "edit":
-        return manipulate_event(request, path, object_id = objId, action = 'edit')
+        return manipulate_event(request, path, desktop, object_id = objId, action = 'edit', window = edit)
     if name == "delete":
         return delete_object(request,
+                             desktop,
+                             Event,
+                             "/specfem3dglobe/events/",
                              object_id = objId,
-                             model =  Event,
-                             post_delete_redirect = "/specfem3dglobe/events/",
                              )
     index = Index({
         "CMTSOLUTION.txt": (event_detail_cmtsolution_txt, (), dict(object_id = objId)),
@@ -868,19 +997,32 @@
     return view(request, *args, **kwds)
 
 
-def sources(request, path):
+def sources(request, path, desktop):
     from models import Source
-    from django.views.generic.list_detail import object_detail
-    from django.views.generic.create_update import update_object, delete_object
+    from list_detail import object_detail
+    from create_update import update_object, delete_object
 
     if not path:
         raise Http404
 
     name = path.pop(0)
     objId = intOr404(name)
+    url = "/specfem3dglobe/events/sources/%d/" % objId
+    
+    view = gui.ChildWindow(url, "View")
+    edit = gui.ChildWindow(url + "edit/", "Edit")
+    menuBar = [
+        gui.Menu("actionMenu", "actions", "Actions",
+                 [gui.MenuItem(url + "delete/", "Delete"),
+                  ]
+                 ),
+        ]
+    view.menuBar = edit.menuBar = menuBar
+    desktop.activeWindow.insertWindow(view)
+    desktop.activeWindow.insertWindow(edit)
 
     if not path:
-        return object_detail(request, object_id = objId, queryset = Source.objects.all())
+        return object_detail(request, desktop, view, object_id = objId, queryset = Source.objects.all())
 
     name = path.pop(0)
     if path: raise Http404
@@ -888,15 +1030,18 @@
     if name == "edit":
         return update_object(
             request,
+            desktop,
+            edit,
+            Source,
             object_id = objId,
-            model = Source,
-            post_save_redirect = "/specfem3dglobe/events/",
+            post_save_redirect = url,
             )
     if name == "delete":
         return delete_object(
             request,
+            desktop,
+            Source,
             object_id = objId,
-            model = Source,
             post_delete_redirect = "/specfem3dglobe/events/",
             )
 
@@ -908,15 +1053,18 @@
     return view(request, *args, **kwds)
     
 
-def event_search(request, path):
+def event_search(request, path, desktop):
     import urllib2
 
     if path: raise Http404
 
+    search = gui.ChildWindow("/specfem3dglobe/events/search/", "Search")
+    desktop.activeWindow.insertWindow(search)
     if not request.GET:
-        return render_to_response('SeismoWebPortal/event_search.html',
-                                  {},
-                                  RequestContext(request, {}))
+        html = loader.render_to_string('SeismoWebPortal/event_search.html')
+        search.content = gui.StaticContent(html)
+        desktop.activeWindow.selectWindow(search)
+        return desktop
 
     # Simply forward the search request to globalcmt.org.
     query = request.GET.urlencode()
@@ -945,26 +1093,33 @@
         except:
             r = Region(event.regionName)
             r.save()
-    
-    return render_to_response('SeismoWebPortal/event_search_results.html',
-                              {'event_list': parser.cmtList },
-                              RequestContext(request, {})) 
 
+    results = gui.ChildWindow(request.path, "Results")
+    html = loader.render_to_string('SeismoWebPortal/event_search_results.html',
+                                   {'event_list': parser.cmtList })
+    results.content = gui.StaticContent(html)
+    desktop.activeWindow.selectWindow(results)
+    return desktop
 
-def manipulate_event(request, path, action=None, object_id=None):
+
+def manipulate_event(request, path, desktop, action=None, object_id=None, window=None):
     from models import Event
     from forms import SingleSourceEventAddManipulator, SingleSourceEventChangeManipulator
 
     if path: raise Http404
     
-    if action == "create":
+    if action == "new":
         manipulator = SingleSourceEventAddManipulator()
         event = None
+        window = gui.ChildWindow("/specfem3dglobe/events/new/", "New")
+        desktop.activeWindow.insertWindow(window)
     elif action == "edit":
         event = get_object_or_404(Event, id=object_id, user__exact=request.user)
         if not event.singleSource:
             return update_object(
                 request,
+                desktop,
+                window,
                 Event,
                 object_id,
                 post_save_redirect = '/specfem3dglobe/events/',
@@ -987,16 +1142,17 @@
         errors = {}
 
     form = forms.FormWrapper(manipulator, new_data, errors)
-    return render_to_response('SeismoWebPortal/single_source_event_form.html',
-                              {'form': form,
-                               'action': request.path,
-                               'object': event,
-                               },
-                              RequestContext(request, {}))
+    html = loader.render_to_string('SeismoWebPortal/single_source_event_form.html',
+                                   {'form': form,
+                                    'action': request.path,
+                                    'object': event,
+                                    })
+    window.content = gui.StaticContent(html)
+    desktop.activeWindow.selectWindow(window)
+    return desktop
 
 
-
-def upload_event(request, path):
+def upload_event(request, path, desktop):
     from forms import UploadEventManipulator
     from os.path import dirname
 
@@ -1025,12 +1181,15 @@
     else:
         errors = new_data = {}
 
+    child = gui.ChildWindow("/specfem3dglobe/events/upload/", "Upload")
     form = forms.FormWrapper(manipulator, new_data, errors)
-    return render_to_response('SeismoWebPortal/event_upload.html',
-                              {'form': form, 'help_visible': help_visible},
-                              RequestContext(request, {}))
+    html = loader.render_to_string('SeismoWebPortal/event_upload.html',
+                                   {'form': form, 'help_visible': help_visible}
+                                   )
+    child.content = gui.StaticContent(html)
+    desktop.activeWindow.selectWindow(child)
+    return desktop
 
-
 def event_detail_gearth(request, object_id):
     from models import Event
     event = get_object_or_404(Event, id=object_id)
@@ -1121,36 +1280,54 @@
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-def stations(request, path):
-    from django.views.generic.list_detail import object_detail
-    from django.views.generic.create_update import update_object, delete_object
+def config_stations(request, path, desktop):
+    from list_detail import object_detail
+    from create_update import update_object, delete_object
     
     if not path: raise Http404
     name = path.pop(0)
 
     if name == "upload":
         if path: raise Http404
-        return upload_station_list(request)
+        return upload_station_list(request, desktop)
     
     objId = intOr404(name)
+    url = "/specfem3dglobe/config/stations/%d/" % objId
+
+    view = gui.ChildWindow(url, "View")
+    edit = gui.ChildWindow(url + "edit/", "Edit")
+    menuBar = [
+        gui.Menu("actionMenu", "actions", "Actions",
+                 [gui.MenuItem(url + "delete/", "Delete"),
+                  ]
+                 ),
+        ]
+    view.menuBar = edit.menuBar = menuBar
+    desktop.activeWindow.insertWindow(view)
+    desktop.activeWindow.insertWindow(edit)
+
     if not path:
-        return object_detail(request, object_id = objId, queryset = StationList.user_objects.all())
-        
+        return object_detail(request, desktop, view, StationList.user_objects.all(), object_id = objId)
+
     name = path.pop(0)
     if path: raise Http404
 
     if name == "edit":
         return update_object(request,
+                             desktop,
+                             edit,
                              StationList,
                              object_id = objId,
-                             post_save_redirect = "/specfem3dglobe/stations/%(id)d/",
+                             post_save_redirect = "/specfem3dglobe/config/stations/%(id)d/",
                              follow = { 'user': False },
                              )
+    
     if name == "delete":
         return delete_object(request,
+                             desktop,
                              StationList,
                              object_id = objId,
-                             post_delete_redirect = "/specfem3dglobe/objects/",
+                             post_delete_redirect = "/specfem3dglobe/config/",
                              )
 
     index = Index({
@@ -1161,7 +1338,7 @@
     return view(request, object_id = objId)
 
 
-def upload_station_list(request):
+def upload_station_list(request, desktop):
     from os.path import dirname
     
     manipulator = UploadStationListManipulator()
@@ -1187,10 +1364,14 @@
     else:
         errors = new_data = {}
 
+    child = gui.ChildWindow("/specfem3dglobe/config/stations/upload/", "Upload")
     form = forms.FormWrapper(manipulator, new_data, errors)
-    return render_to_response('SeismoWebPortal/stationlist_upload.html',
-                              {'form': form, 'help_visible': help_visible},
-                              RequestContext(request, {}))
+    html = loader.render_to_string('SeismoWebPortal/stationlist_upload.html',
+                                   {'form': form, 'help_visible': help_visible}
+                                   )
+    child.content = gui.StaticContent(html)
+    desktop.activeWindow.selectWindow(child)
+    return desktop
 
 
 def stationlist_detail_gearth(request, object_id):
@@ -1292,7 +1473,7 @@
 
 from models import UserInfo
 
-def help(request, path):
+def help(request, path, desktop):
     if path != ["toggle"] or request.method != 'POST':
         raise Http404
     
@@ -1341,7 +1522,7 @@
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 def mineos_parameters_pml(request, sim_id):
-    from django.template import loader, Context
+    from django.template import Context
 
     response = HttpResponse(mimetype='text/xml')
 



More information about the cig-commits mailing list