[cig-commits] r11921 - in cs/portal/trunk/northridge/SeismoWebPortal: . static static/images templates/SeismoWebPortal

leif at geodynamics.org leif at geodynamics.org
Tue May 6 17:35:54 PDT 2008


Author: leif
Date: 2008-05-06 17:35:54 -0700 (Tue, 06 May 2008)
New Revision: 11921

Added:
   cs/portal/trunk/northridge/SeismoWebPortal/static/icons/
   cs/portal/trunk/northridge/SeismoWebPortal/static/images/
   cs/portal/trunk/northridge/SeismoWebPortal/static/images/delete_icon.gif
   cs/portal/trunk/northridge/SeismoWebPortal/static/images/dup_icon.gif
   cs/portal/trunk/northridge/SeismoWebPortal/static/images/input_background.gif
   cs/portal/trunk/northridge/SeismoWebPortal/static/images/ps.gif
   cs/portal/trunk/northridge/SeismoWebPortal/static/images/search_icon.gif
   cs/portal/trunk/northridge/SeismoWebPortal/static/images/seismogram.gif
   cs/portal/trunk/northridge/SeismoWebPortal/static/images/user.gif
   cs/portal/trunk/northridge/SeismoWebPortal/static/script.js
   cs/portal/trunk/northridge/SeismoWebPortal/static/style.css
Modified:
   cs/portal/trunk/northridge/SeismoWebPortal/mezzanine.py
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/base.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/pluggable.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/root.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/views.py
Log:
New UI design.


Modified: cs/portal/trunk/northridge/SeismoWebPortal/mezzanine.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/mezzanine.py	2008-05-06 20:54:35 UTC (rev 11920)
+++ cs/portal/trunk/northridge/SeismoWebPortal/mezzanine.py	2008-05-07 00:35:54 UTC (rev 11921)
@@ -361,7 +361,9 @@
         c = RequestContext(request, {'form': form, 'help_visible': help_visible})
         return t.render(c)
 
+    id = property(lambda self: self.obj.id)
 
+
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 

Copied: cs/portal/trunk/northridge/SeismoWebPortal/static/icons (from rev 11920, cs/portal/trunk/seismo/SeismoWebPortal/static/icons)

Added: cs/portal/trunk/northridge/SeismoWebPortal/static/images/delete_icon.gif
===================================================================
(Binary files differ)


Property changes on: cs/portal/trunk/northridge/SeismoWebPortal/static/images/delete_icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: cs/portal/trunk/northridge/SeismoWebPortal/static/images/dup_icon.gif
===================================================================
(Binary files differ)


Property changes on: cs/portal/trunk/northridge/SeismoWebPortal/static/images/dup_icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: cs/portal/trunk/northridge/SeismoWebPortal/static/images/input_background.gif
===================================================================
(Binary files differ)


Property changes on: cs/portal/trunk/northridge/SeismoWebPortal/static/images/input_background.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: cs/portal/trunk/northridge/SeismoWebPortal/static/images/ps.gif
===================================================================
(Binary files differ)


Property changes on: cs/portal/trunk/northridge/SeismoWebPortal/static/images/ps.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: cs/portal/trunk/northridge/SeismoWebPortal/static/images/search_icon.gif
===================================================================
(Binary files differ)


Property changes on: cs/portal/trunk/northridge/SeismoWebPortal/static/images/search_icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: cs/portal/trunk/northridge/SeismoWebPortal/static/images/seismogram.gif
===================================================================
(Binary files differ)


Property changes on: cs/portal/trunk/northridge/SeismoWebPortal/static/images/seismogram.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: cs/portal/trunk/northridge/SeismoWebPortal/static/images/user.gif
===================================================================
(Binary files differ)


Property changes on: cs/portal/trunk/northridge/SeismoWebPortal/static/images/user.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: cs/portal/trunk/northridge/SeismoWebPortal/static/script.js
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/static/script.js	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/static/script.js	2008-05-07 00:35:54 UTC (rev 11921)
@@ -0,0 +1,1133 @@
+
+/* ----- register_function.js ----- */
+/* Essential javascripts, used a lot. 
+ * These should be placed inline
+ * We have to be certain they are loaded before anything that uses them 
+ */
+
+// check for ie5 mac
+var bugRiddenCrashPronePieceOfJunk = (
+    navigator.userAgent.indexOf('MSIE 5') != -1
+    &&
+    navigator.userAgent.indexOf('Mac') != -1
+)
+
+// check for W3CDOM compatibility
+var W3CDOM = (!bugRiddenCrashPronePieceOfJunk &&
+               typeof document.getElementsByTagName != 'undefined' &&
+               typeof document.createElement != 'undefined' );
+
+// cross browser function for registering event handlers
+var registerEventListener = undefined;
+
+if (typeof addEvent != 'undefined') {
+    // use Dean Edwards' function if available
+    registerEventListener = function (elem, event, func) {
+        addEvent(elem, event, func);
+        return true;
+    }
+} else if (window.addEventListener) {
+    registerEventListener = function (elem, event, func) {
+        elem.addEventListener(event, func, false);
+        return true;
+    }
+} else if (window.attachEvent) {
+    registerEventListener = function (elem, event, func) {
+        var result = elem.attachEvent("on"+event, func);
+        return result;
+    }
+} else {
+    registerEventListener = function (elem, event, func) {
+        // maybe we could implement something with an array
+        return false;
+    }
+}
+
+// cross browser function for unregistering event handlers
+var unRegisterEventListener = undefined;
+
+if (typeof removeEvent != 'undefined') {
+    // use Dean Edwards' function if available
+    unRegisterEventListener = function (elem, event, func) {
+        removeEvent(element, event, func);
+        return true;
+    }
+} else if (window.removeEventListener) {
+    unRegisterEventListener = function (elem, event, func) {
+        elem.removeEventListener(event, func, false);
+        return true;
+    }
+} else if (window.detachEvent) {
+    unRegisterEventListener = function (elem, event, func) {
+        var result = elem.detachEvent("on"+event, func);
+        return result;
+    }
+} else {
+    unRegisterEventListener = function (elem, event, func) {
+        // maybe we could implement something with an array
+        return false;
+    }
+}
+
+var registerPloneFunction = undefined;
+
+if (typeof addDOMLoadEvent != 'undefined') {
+    registerPloneFunction = function (func) {
+        // registers a function to fire ondomload.
+        registerEventListener(window, "domload", func);
+    }
+} else {
+    registerPloneFunction = function (func) {
+        // registers a function to fire onload.
+        registerEventListener(window, "load", func);
+    }
+}
+
+function getContentArea() {
+    // returns our content area element
+    if (W3CDOM) {
+        var node = document.getElementById('region-content');
+        if (!node) {
+            node = document.getElementById('content');
+        }
+        return node;
+    }
+} 
+
+
+/* ----- cssQuery.js ----- */
+/*
+	cssQuery, version 2.0.2 (2005-08-19)
+	Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)
+	License: http://creativecommons.org/licenses/LGPL/2.1/
+*/
+
+// the following functions allow querying of the DOM using CSS selectors
+var cssQuery = function() {
+var version = "2.0.2";
+
+// -----------------------------------------------------------------------
+// main query function
+// -----------------------------------------------------------------------
+
+var $COMMA = /\s*,\s*/;
+var cssQuery = function($selector, $$from) {
+try {
+	var $match = [];
+	var $useCache = arguments.callee.caching && !$$from;
+	var $base = ($$from) ? ($$from.constructor == Array) ? $$from : [$$from] : [document];
+	// process comma separated selectors
+	var $$selectors = parseSelector($selector).split($COMMA), i;
+	for (i = 0; i < $$selectors.length; i++) {
+		// convert the selector to a stream
+		$selector = _toStream($$selectors[i]);
+		// faster chop if it starts with id (MSIE only)
+		if (isMSIE && $selector.slice(0, 3).join("") == " *#") {
+			$selector = $selector.slice(2);
+			$$from = _msie_selectById([], $base, $selector[1]);
+		} else $$from = $base;
+		// process the stream
+		var j = 0, $token, $filter, $arguments, $cacheSelector = "";
+		while (j < $selector.length) {
+			$token = $selector[j++];
+			$filter = $selector[j++];
+			$cacheSelector += $token + $filter;
+			// some pseudo-classes allow arguments to be passed
+			//  e.g. nth-child(even)
+			$arguments = "";
+			if ($selector[j] == "(") {
+				while ($selector[j++] != ")" && j < $selector.length) {
+					$arguments += $selector[j];
+				}
+				$arguments = $arguments.slice(0, -1);
+				$cacheSelector += "(" + $arguments + ")";
+			}
+			// process a token/filter pair use cached results if possible
+			$$from = ($useCache && cache[$cacheSelector]) ?
+				cache[$cacheSelector] : select($$from, $token, $filter, $arguments);
+			if ($useCache) cache[$cacheSelector] = $$from;
+		}
+		$match = $match.concat($$from);
+	}
+	delete cssQuery.error;
+	return $match;
+} catch ($error) {
+	cssQuery.error = $error;
+	return [];
+}};
+
+// -----------------------------------------------------------------------
+// public interface
+// -----------------------------------------------------------------------
+
+cssQuery.toString = function() {
+	return "function cssQuery() {\n  [version " + version + "]\n}";
+};
+
+// caching
+var cache = {};
+cssQuery.caching = false;
+cssQuery.clearCache = function($selector) {
+	if ($selector) {
+		$selector = _toStream($selector).join("");
+		delete cache[$selector];
+	} else cache = {};
+};
+
+// allow extensions
+var modules = {};
+var loaded = false;
+cssQuery.addModule = function($name, $script) {
+	if (loaded) eval("$script=" + String($script));
+	modules[$name] = new $script();;
+};
+
+// hackery
+cssQuery.valueOf = function($code) {
+	return $code ? eval($code) : this;
+};
+
+// -----------------------------------------------------------------------
+// declarations
+// -----------------------------------------------------------------------
+
+var selectors = {};
+var pseudoClasses = {};
+// a safari bug means that these have to be declared here
+var AttributeSelector = {match: /\[([\w-]+(\|[\w-]+)?)\s*(\W?=)?\s*([^\]]*)\]/};
+var attributeSelectors = [];
+
+// -----------------------------------------------------------------------
+// selectors
+// -----------------------------------------------------------------------
+
+// descendant selector
+selectors[" "] = function($results, $from, $tagName, $namespace) {
+	// loop through current selection
+	var $element, i, j;
+	for (i = 0; i < $from.length; i++) {
+		// get descendants
+		var $subset = getElementsByTagName($from[i], $tagName, $namespace);
+		// loop through descendants and add to results selection
+		for (j = 0; ($element = $subset[j]); j++) {
+			if (thisElement($element) && compareNamespace($element, $namespace))
+				$results.push($element);
+		}
+	}
+};
+
+// ID selector
+selectors["#"] = function($results, $from, $id) {
+	// loop through current selection and check ID
+	var $element, j;
+	for (j = 0; ($element = $from[j]); j++) if ($element.id == $id) $results.push($element);
+};
+
+// class selector
+selectors["."] = function($results, $from, $className) {
+	// create a RegExp version of the class
+	$className = new RegExp("(^|\\s)" + $className + "(\\s|$)");
+	// loop through current selection and check class
+	var $element, i;
+	for (i = 0; ($element = $from[i]); i++)
+		if ($className.test($element.className)) $results.push($element);
+};
+
+// pseudo-class selector
+selectors[":"] = function($results, $from, $pseudoClass, $arguments) {
+	// retrieve the cssQuery pseudo-class function
+	var $test = pseudoClasses[$pseudoClass], $element, i;
+	// loop through current selection and apply pseudo-class filter
+	if ($test) for (i = 0; ($element = $from[i]); i++)
+		// if the cssQuery pseudo-class function returns "true" add the element
+		if ($test($element, $arguments)) $results.push($element);
+};
+
+// -----------------------------------------------------------------------
+// pseudo-classes
+// -----------------------------------------------------------------------
+
+pseudoClasses["link"] = function($element) {
+	var $document = getDocument($element);
+	if ($document.links) for (var i = 0; i < $document.links.length; i++) {
+		if ($document.links[i] == $element) return true;
+	}
+};
+
+pseudoClasses["visited"] = function($element) {
+	// can't do this without jiggery-pokery
+};
+
+// -----------------------------------------------------------------------
+// DOM traversal
+// -----------------------------------------------------------------------
+
+// IE5/6 includes comments (LOL) in it's elements collections.
+// so we have to check for this. the test is tagName != "!". LOL (again).
+var thisElement = function($element) {
+	return ($element && $element.nodeType == 1 && $element.tagName != "!") ? $element : null;
+};
+
+// return the previous element to the supplied element
+//  previousSibling is not good enough as it might return a text or comment node
+var previousElementSibling = function($element) {
+	while ($element && ($element = $element.previousSibling) && !thisElement($element)) continue;
+	return $element;
+};
+
+// return the next element to the supplied element
+var nextElementSibling = function($element) {
+	while ($element && ($element = $element.nextSibling) && !thisElement($element)) continue;
+	return $element;
+};
+
+// return the first child ELEMENT of an element
+//  NOT the first child node (though they may be the same thing)
+var firstElementChild = function($element) {
+	return thisElement($element.firstChild) || nextElementSibling($element.firstChild);
+};
+
+var lastElementChild = function($element) {
+	return thisElement($element.lastChild) || previousElementSibling($element.lastChild);
+};
+
+// return child elements of an element (not child nodes)
+var childElements = function($element) {
+	var $childElements = [];
+	$element = firstElementChild($element);
+	while ($element) {
+		$childElements.push($element);
+		$element = nextElementSibling($element);
+	}
+	return $childElements;
+};
+
+// -----------------------------------------------------------------------
+// browser compatibility
+// -----------------------------------------------------------------------
+
+// all of the functions in this section can be overwritten. the default
+//  configuration is for IE. The functions below reflect this. standard
+//  methods are included in a separate module. It would probably be better
+//  the other way round of course but this makes it easier to keep IE7 trim.
+
+var isMSIE = true;
+
+var isXML = function($element) {
+	var $document = getDocument($element);
+	return (typeof $document.mimeType == "unknown") ?
+		/\.xml$/i.test($document.URL) :
+		Boolean($document.mimeType == "XML Document");
+};
+
+// return the element's containing document
+var getDocument = function($element) {
+	return $element.ownerDocument || $element.document;
+};
+
+var getElementsByTagName = function($element, $tagName) {
+	return ($tagName == "*" && $element.all) ? $element.all : $element.getElementsByTagName($tagName);
+};
+
+var compareTagName = function($element, $tagName, $namespace) {
+	if ($tagName == "*") return thisElement($element);
+	if (!compareNamespace($element, $namespace)) return false;
+	if (!isXML($element)) $tagName = $tagName.toUpperCase();
+	return $element.tagName == $tagName;
+};
+
+var compareNamespace = function($element, $namespace) {
+	return !$namespace || ($namespace == "*") || ($element.scopeName == $namespace);
+};
+
+var getTextContent = function($element) {
+	return $element.innerText;
+};
+
+function _msie_selectById($results, $from, id) {
+	var $match, i, j;
+	for (i = 0; i < $from.length; i++) {
+		if ($match = $from[i].all.item(id)) {
+			if ($match.id == id) $results.push($match);
+			else if ($match.length != null) {
+				for (j = 0; j < $match.length; j++) {
+					if ($match[j].id == id) $results.push($match[j]);
+				}
+			}
+		}
+	}
+	return $results;
+};
+
+// for IE5.0
+if (![].push) Array.prototype.push = function() {
+	for (var i = 0; i < arguments.length; i++) {
+		this[this.length] = arguments[i];
+	}
+	return this.length;
+};
+
+// -----------------------------------------------------------------------
+// query support
+// -----------------------------------------------------------------------
+
+// select a set of matching elements.
+// "from" is an array of elements.
+// "token" is a character representing the type of filter
+//  e.g. ">" means child selector
+// "filter" represents the tag name, id or class name that is being selected
+// the function returns an array of matching elements
+var $NAMESPACE = /\|/;
+function select($$from, $token, $filter, $arguments) {
+	if ($NAMESPACE.test($filter)) {
+		$filter = $filter.split($NAMESPACE);
+		$arguments = $filter[0];
+		$filter = $filter[1];
+	}
+	var $results = [];
+	if (selectors[$token]) {
+		selectors[$token]($results, $$from, $filter, $arguments);
+	}
+	return $results;
+};
+
+// -----------------------------------------------------------------------
+// parsing
+// -----------------------------------------------------------------------
+
+// convert css selectors to a stream of tokens and filters
+//  it's not a real stream. it's just an array of strings.
+var $STANDARD_SELECT = /^[^\s>+~]/;
+var $$STREAM = /[\s#.:>+~()@]|[^\s#.:>+~()@]+/g;
+function _toStream($selector) {
+	if ($STANDARD_SELECT.test($selector)) $selector = " " + $selector;
+	return $selector.match($$STREAM) || [];
+};
+
+var $WHITESPACE = /\s*([\s>+~(),]|^|$)\s*/g;
+var $IMPLIED_ALL = /([\s>+~,]|[^(]\+|^)([#.:@])/g;
+var parseSelector = function($selector) {
+	return $selector
+	// trim whitespace
+	.replace($WHITESPACE, "$1")
+	// e.g. ".class1" --> "*.class1"
+	.replace($IMPLIED_ALL, "$1*$2");
+};
+
+var Quote = {
+	toString: function() {return "'"},
+	match: /^('[^']*')|("[^"]*")$/,
+	test: function($string) {
+		return this.match.test($string);
+	},
+	add: function($string) {
+		return this.test($string) ? $string : this + $string + this;
+	},
+	remove: function($string) {
+		return this.test($string) ? $string.slice(1, -1) : $string;
+	}
+};
+
+var getText = function($text) {
+	return Quote.remove($text);
+};
+
+var $ESCAPE = /([\/()[\]?{}|*+-])/g;
+function regEscape($string) {
+	return $string.replace($ESCAPE, "\\$1");
+};
+
+// -----------------------------------------------------------------------
+// modules
+// -----------------------------------------------------------------------
+
+/*
+	cssQuery, version 2.0.2 (2005-08-19)
+	Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)
+	License: http://creativecommons.org/licenses/LGPL/2.1/
+*/
+
+cssQuery.addModule("css-standard", function() { // override IE optimisation
+
+// cssQuery was originally written as the CSS engine for IE7. It is
+//  optimised (in terms of size not speed) for IE so this module is
+//  provided separately to provide cross-browser support.
+
+// -----------------------------------------------------------------------
+// browser compatibility
+// -----------------------------------------------------------------------
+
+// sniff for Win32 Explorer
+isMSIE = eval("false;/*@cc_on at if(@\x5fwin32)isMSIE=true at end@*/");
+
+if (!isMSIE) {
+	getElementsByTagName = function($element, $tagName, $namespace) {
+		return $namespace ? $element.getElementsByTagNameNS("*", $tagName) :
+			$element.getElementsByTagName($tagName);
+	};
+
+	compareNamespace = function($element, $namespace) {
+		return !$namespace || ($namespace == "*") || ($element.prefix == $namespace);
+	};
+
+	isXML = document.contentType ? function($element) {
+		return /xml/i.test(getDocument($element).contentType);
+	} : function($element) {
+		return getDocument($element).documentElement.tagName != "HTML";
+	};
+
+	getTextContent = function($element) {
+		// mozilla || opera || other
+		return $element.textContent || $element.innerText || _getTextContent($element);
+	};
+
+	function _getTextContent($element) {
+		var $textContent = "", $node, i;
+		for (i = 0; ($node = $element.childNodes[i]); i++) {
+			switch ($node.nodeType) {
+				case 11: // document fragment
+				case 1: $textContent += _getTextContent($node); break;
+				case 3: $textContent += $node.nodeValue; break;
+			}
+		}
+		return $textContent;
+	};
+}
+}); // addModule
+
+/*
+	cssQuery, version 2.0.2 (2005-08-19)
+	Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)
+	License: http://creativecommons.org/licenses/LGPL/2.1/
+*/
+
+cssQuery.addModule("css-level2", function() {
+
+// -----------------------------------------------------------------------
+// selectors
+// -----------------------------------------------------------------------
+
+// child selector
+selectors[">"] = function($results, $from, $tagName, $namespace) {
+	var $element, i, j;
+	for (i = 0; i < $from.length; i++) {
+		var $subset = childElements($from[i]);
+		for (j = 0; ($element = $subset[j]); j++)
+			if (compareTagName($element, $tagName, $namespace))
+				$results.push($element);
+	}
+};
+
+// sibling selector
+selectors["+"] = function($results, $from, $tagName, $namespace) {
+	for (var i = 0; i < $from.length; i++) {
+		var $element = nextElementSibling($from[i]);
+		if ($element && compareTagName($element, $tagName, $namespace))
+			$results.push($element);
+	}
+};
+
+// attribute selector
+selectors["@"] = function($results, $from, $attributeSelectorID) {
+	var $test = attributeSelectors[$attributeSelectorID].test;
+	var $element, i;
+	for (i = 0; ($element = $from[i]); i++)
+		if ($test($element)) $results.push($element);
+};
+
+// -----------------------------------------------------------------------
+// pseudo-classes
+// -----------------------------------------------------------------------
+
+pseudoClasses["first-child"] = function($element) {
+	return !previousElementSibling($element);
+};
+
+pseudoClasses["lang"] = function($element, $code) {
+	$code = new RegExp("^" + $code, "i");
+	while ($element && !$element.getAttribute("lang")) $element = $element.parentNode;
+	return $element && $code.test($element.getAttribute("lang"));
+};
+
+// -----------------------------------------------------------------------
+//  attribute selectors
+// -----------------------------------------------------------------------
+
+// constants
+AttributeSelector.NS_IE = /\\:/g;
+AttributeSelector.PREFIX = "@";
+// properties
+AttributeSelector.tests = {};
+// methods
+AttributeSelector.replace = function($match, $attribute, $namespace, $compare, $value) {
+	var $key = this.PREFIX + $match;
+	if (!attributeSelectors[$key]) {
+		$attribute = this.create($attribute, $compare || "", $value || "");
+		// store the selector
+		attributeSelectors[$key] = $attribute;
+		attributeSelectors.push($attribute);
+	}
+	return attributeSelectors[$key].id;
+};
+AttributeSelector.parse = function($selector) {
+	$selector = $selector.replace(this.NS_IE, "|");
+	var $match;
+	while ($match = $selector.match(this.match)) {
+		var $replace = this.replace($match[0], $match[1], $match[2], $match[3], $match[4]);
+		$selector = $selector.replace(this.match, $replace);
+	}
+	return $selector;
+};
+AttributeSelector.create = function($propertyName, $test, $value) {
+	var $attributeSelector = {};
+	$attributeSelector.id = this.PREFIX + attributeSelectors.length;
+	$attributeSelector.name = $propertyName;
+	$test = this.tests[$test];
+	$test = $test ? $test(this.getAttribute($propertyName), getText($value)) : false;
+	$attributeSelector.test = new Function("e", "return " + $test);
+	return $attributeSelector;
+};
+AttributeSelector.getAttribute = function($name) {
+	switch ($name.toLowerCase()) {
+		case "id":
+			return "e.id";
+		case "class":
+			return "e.className";
+		case "for":
+			return "e.htmlFor";
+		case "href":
+			if (isMSIE) {
+				// IE always returns the full path not the fragment in the href attribute
+				//  so we RegExp it out of outerHTML. Opera does the same thing but there
+				//  is no way to get the original attribute.
+				return "String((e.outerHTML.match(/href=\\x22?([^\\s\\x22]*)\\x22?/)||[])[1]||'')";
+			}
+	}
+	return "e.getAttribute('" + $name.replace($NAMESPACE, ":") + "')";
+};
+
+// -----------------------------------------------------------------------
+//  attribute selector tests
+// -----------------------------------------------------------------------
+
+AttributeSelector.tests[""] = function($attribute) {
+	return $attribute;
+};
+
+AttributeSelector.tests["="] = function($attribute, $value) {
+	return $attribute + "==" + Quote.add($value);
+};
+
+AttributeSelector.tests["~="] = function($attribute, $value) {
+	return "/(^| )" + regEscape($value) + "( |$)/.test(" + $attribute + ")";
+};
+
+AttributeSelector.tests["|="] = function($attribute, $value) {
+	return "/^" + regEscape($value) + "(-|$)/.test(" + $attribute + ")";
+};
+
+// -----------------------------------------------------------------------
+//  parsing
+// -----------------------------------------------------------------------
+
+// override parseSelector to parse out attribute selectors
+var _parseSelector = parseSelector;
+parseSelector = function($selector) {
+	return _parseSelector(AttributeSelector.parse($selector));
+};
+
+}); // addModule
+
+/*
+	cssQuery, version 2.0.2 (2005-08-19)
+	Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)
+	License: http://creativecommons.org/licenses/LGPL/2.1/
+*/
+
+/* Thanks to Bill Edney */
+
+cssQuery.addModule("css-level3", function() {
+
+// -----------------------------------------------------------------------
+// selectors
+// -----------------------------------------------------------------------
+
+// indirect sibling selector
+selectors["~"] = function($results, $from, $tagName, $namespace) {
+	var $element, i;
+	for (i = 0; ($element = $from[i]); i++) {
+		while ($element = nextElementSibling($element)) {
+			if (compareTagName($element, $tagName, $namespace))
+				$results.push($element);
+		}
+	}
+};
+
+// -----------------------------------------------------------------------
+// pseudo-classes
+// -----------------------------------------------------------------------
+
+// I'm hoping these pseudo-classes are pretty readable. Let me know if
+//  any need explanation.
+
+pseudoClasses["contains"] = function($element, $text) {
+	$text = new RegExp(regEscape(getText($text)));
+	return $text.test(getTextContent($element));
+};
+
+pseudoClasses["root"] = function($element) {
+	return $element == getDocument($element).documentElement;
+};
+
+pseudoClasses["empty"] = function($element) {
+	var $node, i;
+	for (i = 0; ($node = $element.childNodes[i]); i++) {
+		if (thisElement($node) || $node.nodeType == 3) return false;
+	}
+	return true;
+};
+
+pseudoClasses["last-child"] = function($element) {
+	return !nextElementSibling($element);
+};
+
+pseudoClasses["only-child"] = function($element) {
+	$element = $element.parentNode;
+	return firstElementChild($element) == lastElementChild($element);
+};
+
+pseudoClasses["not"] = function($element, $selector) {
+	var $negated = cssQuery($selector, getDocument($element));
+	for (var i = 0; i < $negated.length; i++) {
+		if ($negated[i] == $element) return false;
+	}
+	return true;
+};
+
+pseudoClasses["nth-child"] = function($element, $arguments) {
+	return nthChild($element, $arguments, previousElementSibling);
+};
+
+pseudoClasses["nth-last-child"] = function($element, $arguments) {
+	return nthChild($element, $arguments, nextElementSibling);
+};
+
+pseudoClasses["target"] = function($element) {
+	return $element.id == location.hash.slice(1);
+};
+
+// UI element states
+
+pseudoClasses["checked"] = function($element) {
+	return $element.checked;
+};
+
+pseudoClasses["enabled"] = function($element) {
+	return $element.disabled === false;
+};
+
+pseudoClasses["disabled"] = function($element) {
+	return $element.disabled;
+};
+
+pseudoClasses["indeterminate"] = function($element) {
+	return $element.indeterminate;
+};
+
+// -----------------------------------------------------------------------
+//  attribute selector tests
+// -----------------------------------------------------------------------
+
+AttributeSelector.tests["^="] = function($attribute, $value) {
+	return "/^" + regEscape($value) + "/.test(" + $attribute + ")";
+};
+
+AttributeSelector.tests["$="] = function($attribute, $value) {
+	return "/" + regEscape($value) + "$/.test(" + $attribute + ")";
+};
+
+AttributeSelector.tests["*="] = function($attribute, $value) {
+	return "/" + regEscape($value) + "/.test(" + $attribute + ")";
+};
+
+// -----------------------------------------------------------------------
+//  nth child support (Bill Edney)
+// -----------------------------------------------------------------------
+
+function nthChild($element, $arguments, $traverse) {
+	switch ($arguments) {
+		case "n": return true;
+		case "even": $arguments = "2n"; break;
+		case "odd": $arguments = "2n+1";
+	}
+
+	var $$children = childElements($element.parentNode);
+	function _checkIndex($index) {
+		var $index = ($traverse == nextElementSibling) ? $$children.length - $index : $index - 1;
+		return $$children[$index] == $element;
+	};
+
+	//	it was just a number (no "n")
+	if (!isNaN($arguments)) return _checkIndex($arguments);
+
+	$arguments = $arguments.split("n");
+	var $multiplier = parseInt($arguments[0]);
+	var $step = parseInt($arguments[1]);
+
+	if ((isNaN($multiplier) || $multiplier == 1) && $step == 0) return true;
+	if ($multiplier == 0 && !isNaN($step)) return _checkIndex($step);
+	if (isNaN($step)) $step = 0;
+
+	var $count = 1;
+	while ($element = $traverse($element)) $count++;
+
+	if (isNaN($multiplier) || $multiplier == 1)
+		return ($traverse == nextElementSibling) ? ($count <= $step) : ($step >= $count);
+
+	return ($count % $multiplier) == $step;
+};
+
+}); // addModule
+
+// -------- >>      insert modules here for packaging       << -------- \\
+
+loaded = true;
+
+// -----------------------------------------------------------------------
+// return the query function
+// -----------------------------------------------------------------------
+
+return cssQuery;
+
+}(); // cssQuery
+
+
+/* ----- nodeutilities.js ----- */
+
+function wrapNode(node, wrappertype, wrapperclass){
+    /* utility function to wrap a node in an arbitrary element of type "wrappertype"
+     * with a class of "wrapperclass" */
+    var wrapper = document.createElement(wrappertype)
+    wrapper.className = wrapperclass;
+    var innerNode = node.parentNode.replaceChild(wrapper,node);
+    wrapper.appendChild(innerNode);
+};
+
+function nodeContained(innernode, outernode){
+    // check if innernode is contained in outernode
+    var node = innernode.parentNode;
+    while (node != document) {
+        if (node == outernode) {
+            return true; 
+        }
+        node=node.parentNode;
+    }
+    return false;
+};
+
+function findContainer(node, func) {
+    // Starting with the given node, find the nearest containing element
+    // for which the given function returns true.
+
+    while (node != null) {
+        if (func(node)) {
+            return node;
+        }
+        node = node.parentNode;
+    }
+    return false;
+};
+
+function hasClassName(node, class_name) {
+    return new RegExp('\\b'+class_name+'\\b').test(node.className);
+};
+
+function addClassName(node, class_name) {
+    if (!node.className) {
+        node.className = class_name;
+    } else if (!hasClassName(node, class_name)) {
+        var className = node.className+" "+class_name;
+        // cleanup
+        node.className = className.split(/\s+/).join(' ');
+    }
+};
+
+function removeClassName(node, class_name) {
+    var className = node.className;
+    if (className) {
+        // remove
+        className = className.replace(new RegExp('\\b'+class_name+'\\b'), '');
+        // cleanup
+        className = className.replace(/\s+/g, ' ');
+        node.className = className.replace(/\s+$/g, '');
+    }
+};
+
+function replaceClassName(node, old_class, new_class, ignore_missing) {
+    if (ignore_missing && !hasClassName(node, old_class)) {
+        addClassName(node, new_class);
+    } else {
+        var className = node.className;
+        if (className) {
+            // replace
+            className = className.replace(new RegExp('\\b'+old_class+'\\b'), new_class);
+            // cleanup
+            className = className.replace(/\s+/g, ' ');
+            node.className = className.replace(/\s+$/g, '');
+        }
+    }
+};
+
+function walkTextNodes(node, func, data) {
+    // traverse childnodes and call func when a textnode is found
+    if (!node){return false}
+    if (node.hasChildNodes) {
+        // we can't use for (i in childNodes) here, because the number of
+        // childNodes might change (higlightsearchterms)
+        for (var i=0;i<node.childNodes.length;i++) {
+            walkTextNodes(node.childNodes[i], func, data);
+        }
+        if (node.nodeType == 3) {
+            // this is a text node
+            func(node, data);
+        }
+    }
+};
+
+/* These are two functions, because getInnerTextFast doesn't always return the
+ * the same results, as it depends on the implementation of node.innerText of
+ * the browser. getInnerTextCompatible will always return the same values, but
+ * is a bit slower. The difference is just in the whitespace, so if this
+ * doesn't matter, you should always use getInnerTextFast.
+ */
+
+function getInnerTextCompatible(node) {
+    var result = new Array();
+    walkTextNodes(node,
+                  function(n, d){d.push(n.nodeValue)},
+                  result);
+    return result.join("");
+};
+
+function getInnerTextFast(node) {
+    if (node.innerText) {
+        return node.innerText;
+    } else {
+        return getInnerTextCompatible(node);
+    }
+};
+
+/* This function reorder nodes in the DOM.
+ * fetch_func - the function which returns the value for comparison
+ * cmp_func - the compare function, if not provided then the string of the
+ * value returned by fetch_func is used.
+ */
+function sortNodes(nodes, fetch_func, cmp_func) {
+    // terminate if we hit a non-compliant DOM implementation
+    if (!W3CDOM){return false};
+
+    // wrapper for sorting
+    var SortNodeWrapper = function(node) {
+        this.value = fetch_func(node);
+        this.cloned_node = node.cloneNode(true);
+        this.toString = function() {
+            if (this.value.toString) {
+                return this.value.toString();
+            } else {
+                return this.value;
+            }
+        }
+    }
+
+    // wrap nodes
+    var items = new Array();
+    for (var i=0; i<nodes.length; i++) {
+        items.push(new SortNodeWrapper(nodes[i]));
+    }
+
+    //sort
+    if (cmp_func) {
+        items.sort(cmp_func);
+    } else {
+        items.sort();
+    }
+
+    // reorder nodes
+    for (var i=0; i<items.length; i++) {
+        var dest = nodes[i];
+        dest.parentNode.replaceChild(items[i].cloned_node, dest);
+    }
+};
+
+
+/* ----- dropdown.js ----- */
+/*
+ * This is the code for the dropdown menus. It uses the following markup:
+ *
+ * <dl class="actionMenu" id="uniqueIdForThisMenu">
+ *   <dt class="actionMenuHeader">
+ *     <!-- The following a-tag needs to be clicked to dropdown the menu -->
+ *     <a href="some_destination">A Title</a>
+ *   </dt>
+ *   <dd class="actionMenuContent">
+ *     <!-- Here can be any content you want -->
+ *   </dd>
+ * </dl>
+ *
+ * When the menu is toggled, then the dl with the class actionMenu will get an
+ * additional class which switches between 'activated' and 'deactivated'.
+ * You can use this to style it accordingly, for example:
+ *
+ * .actionMenu.activated {
+ *   display: block;
+ * }
+ *
+ * .actionMenu.deactivated {
+ *   display: none;
+ * }
+ *
+ * When you click somewhere else than the menu, then all open menus will be
+ * deactivated. When you move your mouse over the a-tag of another menu, then
+ * that one will be activated and all others deactivated. When you click on a
+ * link inside the actionMenuContent element, then the menu will be closed and
+ * the link followed.
+ *
+ * This file uses functions from register_function.js, cssQuery.js and
+ * nodeutils.js.
+ *
+ */
+
+function isActionMenu(node) {
+    if (hasClassName(node, 'actionMenu')) {
+        return true;
+    }
+    return false;
+};
+
+function hideAllMenus() {
+    var menus = cssQuery('dl.actionMenu');
+    for (var i=0; i < menus.length; i++) {
+        replaceClassName(menus[i], 'activated', 'deactivated', true);
+    }
+};
+
+function toggleMenuHandler(event) {
+    if (!event) var event = window.event; // IE compatibility
+
+    // terminate if we hit a non-compliant DOM implementation
+    // returning true, so the link is still followed
+    if (!W3CDOM){return true;}
+
+    var container = findContainer(this, isActionMenu);
+    if (!container) {
+        return true;
+    }
+
+    // check if the menu is visible
+    if (hasClassName(container, 'activated')) {
+        // it's visible - hide it
+        replaceClassName(container, 'activated', 'deactivated', true);
+    } else {
+        // it's invisible - make it visible
+        replaceClassName(container, 'deactivated', 'activated', true);
+    }
+
+    return false;
+};
+
+function hideMenusHandler(event) {
+    if (!event) var event = window.event; // IE compatibility
+
+    hideAllMenus();
+
+    // we want to follow this link
+    return true;
+};
+
+function actionMenuDocumentMouseDown(event) {
+    if (!event) var event = window.event; // IE compatibility
+
+    if (event.target)
+        targ = event.target;
+    else if (event.srcElement)
+        targ = event.srcElement;
+
+    var container = findContainer(targ, isActionMenu);
+    if (container) {
+        // targ is part of the menu, so just return and do the default
+        return true;
+    }
+
+    hideAllMenus();
+
+    return true;
+};
+
+function actionMenuMouseOver(event) {
+    if (!event) var event = window.event; // IE compatibility
+
+    if (!this.tagName && (this.tagName == 'A' || this.tagName == 'a')) {
+        return true;
+    }
+
+    var container = findContainer(this, isActionMenu);
+    if (!container) {
+        return true;
+    }
+    var menu_id = container.id;
+
+    var switch_menu = false;
+    // hide all menus
+    var menus = cssQuery('dl.actionMenu');
+    for (var i=0; i < menus.length; i++) {
+        var menu = menus[i]
+        // check if the menu is visible
+        if (hasClassName(menu, 'activated')) {
+            switch_menu = true;
+        }
+        // turn off menu when it's not the current one
+        if (menu.id != menu_id) {
+            replaceClassName(menu, 'activated', 'deactivated', true);
+        }
+    }
+
+    if (switch_menu) {
+        var menu = cssQuery('#'+menu_id)[0];
+        if (menu) {
+            replaceClassName(menu, 'deactivated', 'activated', true);
+        }
+    }
+
+    return true;
+};
+
+function initializeMenus() {
+    // terminate if we hit a non-compliant DOM implementation
+    if (!W3CDOM) {return false;}
+
+    document.onmousedown = actionMenuDocumentMouseDown;
+
+    hideAllMenus();
+
+    // add toggle function to header links
+    var menu_headers = cssQuery('dl.actionMenu > dt.actionMenuHeader > a');
+    for (var i=0; i < menu_headers.length; i++) {
+        var menu_header = menu_headers[i];
+
+        menu_header.onclick = toggleMenuHandler;
+        menu_header.onmouseover = actionMenuMouseOver;
+    }
+
+    // add hide function to all links in the dropdown, so the dropdown closes
+    // when any link is clicked
+    var menu_contents = cssQuery('dl.actionMenu > dd.actionMenuContent');
+    for (var i=0; i < menu_contents.length; i++) {
+        menu_contents[i].onclick = hideMenusHandler;
+    }
+
+    // uncomment to enable sorting of elements
+    //var nodes = cssQuery('#objectMenu > dd.actionMenuContent li');
+    //sortNodes(nodes, getInnerTextFast);
+};
+
+registerPloneFunction(initializeMenus);

Added: cs/portal/trunk/northridge/SeismoWebPortal/static/style.css
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/static/style.css	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/static/style.css	2008-05-07 00:35:54 UTC (rev 11921)
@@ -0,0 +1,365 @@
+
+body {
+    font-family: "Lucida Grande", Verdana, Lucida, Helvetica, Arial, sans-serif;
+    color: black;
+    background-color: white;
+}
+
+img {
+    border-width: 0;
+}
+
+h1 {
+    font-size: medium;
+}
+
+h1 img {
+    vertical-align: middle;
+}
+
+
+#header {
+    position: fixed;
+    top: 0;
+    left 0;
+    right: 0;
+    width: 100%;
+    z-index: 1;
+    background-color: white;
+}
+
+#login {
+    font-size: small;
+}
+
+#login img {
+    vertical-align: bottom;
+}
+
+
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  buttons
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+#buttonbar {
+    border-style: solid;
+    border-width: 1px;
+    border-color: #8cacbb;
+    background-color: #dee7ec;
+    font-size: small;
+    width: 100%;
+}
+
+td.separator {
+    border-left: 1px dotted #8cacbb;
+}
+
+#buttonbar a {
+    text-decoration: none;
+    color: black;
+}
+
+
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  menus
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+#menubar {
+    border-bottom: 1px solid #8cacbb;
+    width: 100%;
+    font-size: small;
+}
+
+.actionMenu {
+    position: relative;
+    margin: 0;
+    padding: 0;
+}
+
+.actionMenu img {
+    vertical-align: middle;
+}
+
+.actionMenu a {
+    text-decoration: none;
+    color: black;
+}
+
+.actionMenu .actionMenuHeader {
+    border: 1px solid black;
+}
+
+.actionMenu .actionMenuHeader a {
+    padding-left: 1ex;
+    padding-right: 1ex;
+}
+
+.actionMenu.deactivated .actionMenuHeader a:hover {
+    background-color: #cde2a7;
+}
+
+.actionMenu .actionMenuContent {
+    display: none;
+    position: absolute;
+    background-color: white;
+    padding: 0;
+    margin: 0;
+    border: 0;
+}
+
+.actionMenu .actionMenuContent ul {
+    padding: 0;
+    margin: 0;
+    border: 0;
+}
+
+.actionMenu .actionMenuContent li {
+    list-style: none;
+    padding: 0;
+    margin: 0;
+    border: 0;
+}
+
+.actionMenu.activated .actionMenuHeader {
+    color: white;
+    background-color: black;
+}
+
+.actionMenu.activated .actionMenuHeader a {
+    color: white;
+}
+
+.actionMenu.activated .actionMenuContent {
+    display: block;
+    border: 1px solid black;
+}
+
+.actionMenu .actionMenuContent li a {
+    display: block;
+    white-space: nowrap;
+    padding-left: 1ex;
+    padding-right: 1ex;
+}
+
+.actionMenu .actionMenuContent li a:hover {
+    color: white;
+    background-color: black;
+}
+
+
+.actionButton {
+    border: 1px solid black;
+    padding-left: 1ex;
+    padding-right: 1ex;
+    text-decoration: none;
+    color: black;
+}
+
+a.actionButton:hover {
+    color: white;
+    background-color: black;
+}
+
+.actionButton.disabled {
+    color: silver;
+}
+
+
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  radio
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+a.radio {
+    color: black;
+    text-decoration: none;
+}
+
+
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  tables
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+.content table {
+    border: 1px solid black;
+    width: 100%;
+}
+
+.content thead {
+    border-bottom: 1px solid black;
+}
+
+tr.even {
+    background-color: #eef;
+}
+
+.content th {
+    text-align: left;
+    padding-left: 1ex;
+    padding-right: 1ex;
+}
+
+.content th.colgroup {
+    text-align: center;
+}
+
+.content td {
+    padding-left: 1ex;
+    padding-right: 1ex;
+}
+
+.float {
+    text-align: right;
+}
+
+.int {
+    text-align: right;
+}
+
+.notApplicable {
+    color: gray;
+    text-align: center;
+}
+
+.inlineInfo {
+    font-size: small;
+}
+
+
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  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;
+}
+
+input {
+    font-family: "Lucida Grande", Verdana, Lucida, Helvetica, Arial, sans-serif;
+    border: 1px solid #8cacbb;
+    background: White url(/specfem3dglobe/images/input_background.gif) repeat-x;
+}
+
+
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  misc.
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+.cmtsolution pre {
+    border: 1px solid black;
+    padding: 1em;
+    background-color: #eee;
+}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/base.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/base.html	2008-05-06 20:54:35 UTC (rev 11920)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/base.html	2008-05-07 00:35:54 UTC (rev 11921)
@@ -1,28 +1,11 @@
 
 {% 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 %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html	2008-05-06 20:54:35 UTC (rev 11920)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html	2008-05-07 00:35:54 UTC (rev 11921)
@@ -1,11 +1,6 @@
 
 <h2 class=titlebar>{{ object.name }}</h2>
 
-<div class=toolbar>
-    <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>
-
 {% if object.singleSource %}
 
 <p id=sourceBeachballMw>{{ object.singleSource.beachball }} M<sub>w</sub> &cong; {{ object.singleSource.momentMagnitude|stringformat:".2f" }}</p>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_list.html	2008-05-06 20:54:35 UTC (rev 11920)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_list.html	2008-05-07 00:35:54 UTC (rev 11921)
@@ -1,8 +1,6 @@
 
 {% if object_list %}
-    <table rules=groups>
-        <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>
-
+    <table rules=cols>
         <thead>
         <tr>
             <th>name</th>
@@ -12,14 +10,13 @@
             <th>latitude</th>
             <th>longitude</th>
             <th>depth</th>
-            <th>downloads</th>
         </tr>
         </thead>
 
         <tbody>
         {% for object in object_list %}
-        <tr>
-            <th><a href="/specfem3dglobe/?class=Event&object={{object.id}}">{{ object.name }}</a></th>
+        <tr class="{% cycle odd,even %}">
+            <td><a href="/specfem3dglobe/?class=Event&object={{object.id}}">{{ object.name }}</a></td>
             {% if object.singleSource %}
             <td>point-source</td>
             <td>{{ object.singleSource.beachball }}</td>
@@ -35,10 +32,6 @@
             <td class=notApplicable>-</td>
             <td class=notApplicable>-</td>
             {% endif %}
-            <td>
-                <a href="{{ object.id }}/gearth.kml"><img src="/specfem3dglobe/pics/kml.icon.gif" title="View in Google Earth" alt="View in Google Earth"></a>
-                [<a href="{{ object.id }}/CMTSOLUTION.txt">text</a>]
-            </td>
         </tr>
         {% endfor %}
         </tbody>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html	2008-05-06 20:54:35 UTC (rev 11920)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html	2008-05-07 00:35:54 UTC (rev 11921)
@@ -1,24 +1,15 @@
 
-<h2 class=titlebar>{% if object %}edit{% else %}new{% endif %} Mineos mode catalog</h2>
+<h2>{% if object %}edit{% else %}new{% endif %} Mineos mode catalog</h2>
 
-<div class=toolbar>
-    <form method="post" action="/specfem3dglobe/help/toggle/">
-        <input type="hidden" name="post_toggle_redirect" value="{{ action }}">
-        {% if help_visible %}
-        <input type="submit" name="hide_help" value="Hide Help" />
-        {% else %}
-        <input type="submit" name="show_help" value="Show Help" />
-        {% endif %}
-    </form>
-
+<form method="post" action="/specfem3dglobe/">
+    <input type="hidden" name="class" value="MineosModeCatalog">
     {% if object %}
-    <form action="../delete/" method="get"><input type="submit" value="Delete" /></form>
+    <input type="hidden" name="object" value="{{object.id}}">
+    <input type="hidden" name="action" value="edit">
+    {% else %}
+    <input type="hidden" name="action" value="new">
     {% endif %}
 
-</div>
-
-<form method="post" action=".">
-
     {% if form.has_errors %}
     <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
     {% endif %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html	2008-05-06 20:54:35 UTC (rev 11920)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html	2008-05-07 00:35:54 UTC (rev 11921)
@@ -1,11 +1,7 @@
 
-<div class=toolbar>
-    <form action="upload/" method="get"><input type="submit" value="Upload..." /></form>
-</div>
-
 {% if object_list %}
 
-<table rules=cols class=cool width="100%">
+<table rules=cols>
     <thead>
     <tr>
         <th>name</th>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/pluggable.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/pluggable.html	2008-05-06 20:54:35 UTC (rev 11920)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/pluggable.html	2008-05-07 00:35:54 UTC (rev 11921)
@@ -3,11 +3,161 @@
 
 {% block desktop %}
 
+<!--
+{{iconbar}}
 {{toolbar}}
-{{taskbar}}
 
-<h1 class=titlebar>{{title}}</h1>
+<h1>{{title}}</h1>
+-->
 
-{{content}}
+<table id=header>
+    <tr>
+        <td>
+            <h1>
+                <img src="/specfem3dglobe/pics/cig.gif">
+                <img src="/specfem3dglobe/images/seismogram.gif">
+                CIG Seismology Web Portal
+            </h1>
+        </td>
+        <td id=login align=right>
+            {% if user.is_authenticated %}
+            <img src="/specfem3dglobe/images/user.gif"> {{ user.first_name }} ({{ user.username }}) ~
+            {% endif %}
+            <a class="actionButton" href="/specfem3dglobe/logout/">logout</a>
+        </td>
+    </tr>
+    <tr>
+        <td colspan=2>
+            <table id=buttonbar>
+                <tr>
+                    <td align=center>
+                        <a href="/specfem3dglobe/"><img src="/specfem3dglobe/icons/document.gif" width=32 height=32><br>
+                        Home</a>
+                    </td>
+                    <td align=center>
+                        <a href="/specfem3dglobe/?class=Event"><img src="/specfem3dglobe/icons/eventcat.gif" width=32 height=32><br>
+                        Events</a>
+                    </td>
+                    <td align=center>
+                        <a href="/specfem3dglobe/?class=StationList"><img src="/specfem3dglobe/icons/stationlist.gif" width=32 height=32><br>
+                        Stations</a>
+                    </td>
+                    <td class=separator></td>
+                    <td align=center>
+                        <a href="/specfem3dglobe/?class=Specfem3DGlobeParameters"><img src="/specfem3dglobe/icons/parameters.gif" width=32 height=32><br>
+                        3D Parameters</a>
+                    </td>
+                    <td align=center>
+                        <a href="/specfem3dglobe/?class=Specfem3DGlobeMesh"><img src="/specfem3dglobe/icons/mesh.gif" width=32 height=32><br>
+                        Meshes</a>
+                    </td>
+                    <td class=separator></td>
+                    <td align=center>
+                        <a href="/specfem3dglobe/?class=MineosParameters"><img src="/specfem3dglobe/icons/parameters.gif" width=32 height=32><br>
+                        1D Parameters</a>
+                    </td>
+                    <td align=center>
+                        <a href="/specfem3dglobe/?class=MineosModel"><img src="/specfem3dglobe/icons/model.gif" width=32 height=32><br>
+                        1D Models</a>
+                    </td>
+                    <td align=center>
+                        <a href="/specfem3dglobe/?class=MineosModeCatalog"><img src="/specfem3dglobe/icons/modecat.gif" width=32 height=32><br>
+                        Mode Catalogs</a>
+                    </td>
+                </tr>
+            </table>
+        </td>
+    </tr>
+    <tr>
+        <td id=menubar colspan=2>
+            <table>
+                <tr>
+                    <td>
+                        {% ifequal klass 'Event' %}
+                        <a class="actionButton" href="/specfem3dglobe/?class={{klass}}&action=search"><img src="/specfem3dglobe/images/search_icon.gif"> Search</a>
+                        {% else %}
+                        <span class="actionButton disabled"><img src="/specfem3dglobe/images/search_icon.gif"> Search</span>
+                        {% endifequal %}
+                    </td>
+                    <td>
+                        {% ifequal klass 'Specfem3DGlobeMesh' %}
+                        <dl class="actionMenu" id="newMenu">
+                            <dt class="actionMenuHeader">
+                                <a href="some_destination">&diams; New</a>
+                            </dt>
+                            <dd class="actionMenuContent">
+                                <ul>
+                                    <li><a href="red">1-chunk regional mesh</a></li>
+                                    <li><a href="red">2-chunk regional mesh</a></li>
+                                    <li><a href="red">3-chunk regional mesh</a></li>
+                                </ul>
+                            </dd>
+                        </dl>
+                        {% else %}
+                        <a class="actionButton" href="/specfem3dglobe/?class={{klass}}&action=new">New</a>
+                        {% endifequal %}
+                    </td>
+                    <td>
+                        {% if uploadable %}
+                        <a class="actionButton" href="/specfem3dglobe/?class={{klass}}&action=upload">Upload</a>
+                        {% else %}
+                        <span class="actionButton disabled">Upload</span>
+                        {% endif %}
+                    </td>
+                    <td>
+                        {% if obj %}
+                        <a class="actionButton" href="/specfem3dglobe/?class={{klass}}&object={{obj.id}}&action=edit">Edit</a>
+                        {% else %}
+                        <span class="actionButton disabled">Edit</span>
+                        {% endif %}
+                    </td>
+                    <td>
+                        {% if obj %}
+                        <a class="actionButton" href="/specfem3dglobe/?class={{klass}}&object={{obj.id}}&action=duplicate"><img src="/specfem3dglobe/images/dup_icon.gif"> Duplicate</a>
+                        {% else %}
+                        <span class="actionButton disabled"><img src="/specfem3dglobe/images/dup_icon.gif"> Duplicate</span>
+                        {% endif %}
+                    </td>
+                    <td>
+                        {% if obj %}
+                        <a class="actionButton" href="/specfem3dglobe/?class={{klass}}&object={{obj.id}}&action=delete"><img src="/specfem3dglobe/images/delete_icon.gif"> Delete</a>
+                        {% else %}
+                        <span class="actionButton disabled"><img src="/specfem3dglobe/images/delete_icon.gif"> Delete</span>
+                        {% endif %}
+                    </td>
+                    <td>
+                        <dl class="actionMenu" id="downloadMenu">
+                            <dt class="actionMenuHeader">
+                                <a href="some_destination">&diams; Download</a>
+                            </dt>
+                            <dd class="actionMenuContent">
+                                <ul>
+                                    <li><a href="red"><img src="/specfem3dglobe/icons/document.gif" width=32 height=32> Text</a></li>
+                                    <li><a href="red"><img src="/specfem3dglobe/pics/kml.icon.gif"> Google Earth Map</a></li>
+                                    <li><a href="red"><img src="/specfem3dglobe/pics/adobe-pdf.icon.gif"> PDF</a></li>
+                                    <li><a href="red"><img src="/specfem3dglobe/images/ps.gif"> PostScript</a></li>
+                                </ul>
+                            </dd>
+                        </dl>
+                    </td>
+                    <td>
+                        <a class="actionButton" href="/specfem3dglobe/run/">Run Simulation</a>
+                    </td>
+                </tr>
+            </table>
+        </td>
+    </tr>
+</table>
 
+<div class="content">
+    <h1>
+        <img src="/specfem3dglobe/pics/cig.gif">
+        <img src="/specfem3dglobe/images/seismogram.gif">
+        CIG Seismology Web Portal
+    </h1>
+    <p><img src="/specfem3dglobe/icons/document.gif" width=32 height=32><br>&nbsp;</p>
+    <p>&nbsp;</p>
+    {{content}}
+</div>
+
 {% endblock %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/root.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/root.html	2008-05-06 20:54:35 UTC (rev 11920)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/root.html	2008-05-07 00:35:54 UTC (rev 11921)
@@ -1,12 +1,9 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!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>
+    <link href="/specfem3dglobe/style.css" type="text/css" rel="stylesheet" media="all" />
+    <script type="text/javascript" language="javascript" src="/specfem3dglobe/script.js"></script>
     <title>{% block title %}SPECFEM 3D GLOBE{% endblock %}</title>
-    {% block scripts %}
-    {% endblock %}
 </head>
 
 <body>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_list.html	2008-05-06 20:54:35 UTC (rev 11920)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_list.html	2008-05-07 00:35:54 UTC (rev 11921)
@@ -1,16 +1,4 @@
 
-<div class=toolbar>
-            <form action="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..." />
-            </form>
-</div>
-
 {% if object_list %}
     <table border=1 rules=groups>
         <colgroup><col class=even></colgroup>
@@ -50,7 +38,7 @@
 
         <tbody>
         {% for object in object_list %}
-        <tr>
+        <tr class="{% cycle odd,even %}">
             <td class=int>{{ object.nchunks }}</td>
             <td class=int>{{ object.nproc_eta }}</td>
             <td class=int>{{ object.nproc_xi }}</td>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_list.html	2008-05-06 20:54:35 UTC (rev 11920)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_list.html	2008-05-07 00:35:54 UTC (rev 11921)
@@ -1,7 +1,6 @@
 
 {% if object_list %}
-    <table rules=groups>
-        
+    <table rules=cols>
         <thead>
         <tr>
             <th>mesh</th>
@@ -17,7 +16,7 @@
         
         <tbody>
         {% for object in object_list %}
-        <tr>
+        <tr class="{% cycle odd,even %}">
             <td><a href="/specfem3dglobe/specfem3dglobemeshes/{{ object.mesh.id }}/">{{ object.mesh }}</a><br>
                 <span class=inlineInfo>shortest period &cong; {{ object.mesh.shortestPeriod|stringformat:".0f" }}s</span></td>
             <td>{{ object.get_model_display }}</td>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_list.html	2008-05-06 20:54:35 UTC (rev 11920)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_list.html	2008-05-07 00:35:54 UTC (rev 11921)
@@ -1,25 +1,18 @@
 
 {% if object_list %}
-    <table border=0 rules=groups>
-        <colgroup><col class=odd><col class=even><col class=odd></colgroup>
-
+    <table rules=cols>
         <thead>
         <tr>
             <th>name</th>
             <th>number of stations</th>
-            <th>downloads</th>
         </tr>
         </thead>
 
         <tbody>
         {% for object in object_list %}
-        <tr>
+        <tr class="{% cycle odd,even %}">
             <td><a href="/specfem3dglobe/?class=StationList&object={{object.id}}">{{ object.name }}</a></td>
             <td>{{ object.station_set.count }}</td>
-            <td>
-                <a href="{{ object.id }}/gearth.kml"><img src="/specfem3dglobe/pics/kml.icon.gif" title="View in Google Earth" alt="View in Google Earth"></a>
-                [<a href="{{ object.id }}/stations.txt">text</a>]
-            </td>
         </tr>
         {% endfor %}
         </tbody>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/views.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/views.py	2008-05-06 20:54:35 UTC (rev 11920)
+++ cs/portal/trunk/northridge/SeismoWebPortal/views.py	2008-05-07 00:35:54 UTC (rev 11921)
@@ -38,7 +38,7 @@
     if className is None:
         return render_to_response('SeismoWebPortal/home.html',
                                   {},
-                                  RequestContext(request, dict(taskbar = taskbar('home'))))
+                                  RequestContext(request, dict(iconbar = iconbar('home'))))
 
     try:
         Class = getattr(mezzanine, className)
@@ -87,9 +87,12 @@
     t = loader.get_template('SeismoWebPortal/pluggable.html')
     c = RequestContext(request, dict(
         toolbar = toolbar(Class, obj),
-        taskbar = taskbar(Class),
+        iconbar = iconbar(Class),
         title = Class.title(),
         content = ret,
+        klass = Class.__name__,
+        obj = obj,
+        uploadable = hasattr(Class, 'FileFormat'),
         ))
     response.write(t.render(c))
     return response
@@ -127,10 +130,10 @@
     return html.getvalue()
 
 
-def taskbar(selected):
+def iconbar(selected):
     from StringIO import StringIO
     html = StringIO()
-    print >>html, '<div class=taskbar><ul>'
+    print >>html, '<div class=iconbar><ul>'
     print >>html, ('<li class="%s"><a href="/specfem3dglobe/">home</a></li>' %
                    (selected == "home" and "selected" or ""))
     for i, Class in enumerate(mezzanine.classes):
@@ -445,7 +448,7 @@
     # Populate the FormWrapper.
     form = forms.FormWrapper(manipulator, new_data, errors, edit_inline = True)
     
-    return render_to_response(template, { 'form': form, 'taskbar': taskbar('profile') }, RequestContext(request, {}))
+    return render_to_response(template, { 'form': form, 'iconbar': iconbar('profile') }, RequestContext(request, {}))
 
 
 def notify_managers_of_new_user(request, user):
@@ -497,7 +500,7 @@
             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),
-                                              'taskbar': taskbar('profile')},
+                                              'iconbar': iconbar('profile')},
         context_instance=RequestContext(request))
 
 password_change = login_required(password_change)



More information about the cig-commits mailing list