[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 3D GLOBE</span> <span id=webportal>Web Portal</span></h1>
-</div>
-
+<!--
<div class="messages {% if messages %}active{% endif %}">{% if messages %}{{ messages|join:" " }}{% else %} {% 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> ≅ {{ 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">♦ 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">♦ 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> </p>
+ <p> </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 ≅ {{ 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