diff --git a/.hgignore b/.hgignore index 434325c..1841f63 100644 --- a/.hgignore +++ b/.hgignore @@ -3,3 +3,5 @@ syntax: glob *.pyc *.db3 *~ +.directory + diff --git a/htdocs/css/my_layout.css b/htdocs/css/my_layout.css new file mode 100644 index 0000000..6ed84e0 --- /dev/null +++ b/htdocs/css/my_layout.css @@ -0,0 +1,22 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS framework + * (en) central stylesheet + * (de) zentrales Stylesheet + * + * @creator YAML Builder V1.2b (http://builder.yaml.de) + * @file my_layout.css + * @-yaml-minver 3.1 + * + */ + +/* import core styles | Basis-Stylesheets einbinden */ +@import url(../yaml/core/base.css); + +/* import screen layout | Screen-Layout einbinden */ +@import url(../yaml/navigation/nav_shinybuttons.css); +@import url(screen/basemod.css); +@import url(screen/content.css); + +/* import print layout | Druck-Layout einbinden */ +@import url(../yaml/print/print_draft.css); diff --git a/htdocs/css/patches/patch_my_layout.css b/htdocs/css/patches/patch_my_layout.css new file mode 100644 index 0000000..b99f062 --- /dev/null +++ b/htdocs/css/patches/patch_my_layout.css @@ -0,0 +1,47 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS framework + * (en) IE patch stylesheet + * (de) IE-Anpassungs-Stylesheet + * + * @creator YAML Builder V1.2b (http://builder.yaml.de) + * @file patch_my_layout.css + * @-yaml-minver 3.1 + */ + +/* Layout independent adjustments | Layout-unabhängige Anpassungen */ +@import url(../../yaml/core/iehacks.css); + +/* Layout-dependent adjustments | Layout-abhängige Anpassungen */ +@media screen, projection +{ + /** + * Bugfix for IE 3-Pixel-Jog Bug + * + * @bugfix + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + + * html #col3 {height: 1%} + * html #col1 {margin-right: -3px} + * html #col3 {margin-left: 24%} + + /** + * min-width/max-width workaround for IE + * + * @workaround + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid no + */ + + * html .page_margins { + /* Fallback if JavaScript is disabled */ + width: auto; + + /* JS-Expression for min-/max-width simulation */ + width: expression((document.documentElement && document.documentElement.clientHeight) ? ((document.documentElement.clientWidth < 740) ? "740px" : ((document.documentElement.clientWidth > (90 * 16 * (parseInt(this.parentNode.currentStyle.fontSize) / 100))) ? "90em" : "auto" )) : ((document.body.clientWidth < 740) ? "740px" : ((document.body.clientWidth > (90 * 16 * (parseInt(this.parentNode.currentStyle.fontSize) / 100))) ? "90em" : "auto" ))); + } +} diff --git a/htdocs/css/screen/basemod.css b/htdocs/css/screen/basemod.css new file mode 100644 index 0000000..869b64c --- /dev/null +++ b/htdocs/css/screen/basemod.css @@ -0,0 +1,126 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS framework + * (en) stylesheet for screen layout + * (de) Stylesheet für das Bildschirm-Layout + * + * @creator YAML Builder V1.2b (http://builder.yaml.de) + * @file basemod.css + * @-yaml-minver 3.1 + */ + +@media screen, projection +{ + /*-------------------------------------------------------------------------*/ + + /* (en) Marginal areas & page background */ + /* (de) Randbereiche & Seitenhintergrund */ + body { background: #3b69ad none; padding: 10px 0; } + + /* Layout Alignment | Layout-Ausrichtung */ + .page_margins { margin: 0 auto; } + + /* Layout Properties | Layout-Eigenschaften */ + .page_margins { width: auto; min-width: 740px; max-width: 90em; background: #fff; } + .page { padding: 10px 15px 10px 10px; } + #header { padding: 45px 2em 1em 20px; color: #000; background: #fff; } + #topnav { color: #aaa; background: transparent; } + #nav { overflow:hidden; } + div.hlist { } + #main { margin: 10px 0; background: #fff; } + #footer { padding: 10px 20px; color:#666; background: #f9f9f9; border-top: 5px #efefef solid; } + + /* (en) navigation: horizontal adjustment | (de) horizontale Ausrichtung */ + #nav ul { margin-left: 20px; } + + /*-------------------------------------------------------------------------*/ + + /** + * (en) Formatting content container + * (de) Formatierung der Inhalts-Container + * + */ + + #col1 { float: left; width: 25%} + #col2 { display:none} + #col3 { width: auto; margin: 0 0 0 25%} + #col1_content { padding: 0 10px 0 20px } + #col3_content { padding: 0 20px 0 10px } + + /*-------------------------------------------------------------------------*/ + + .page_margins { + border: 0 none; + background-image: url(../../images/gfxborder/border_left.gif); + background-repeat:repeat-y; + background-position:left; + } + + .page { + border: 0 none; + margin: 0 0 0 5px; padding: 10px 15px 10px 10px; + background-image: url(../../images/gfxborder/border_right.gif); + background-repeat:repeat-y; + background-position:right; + } + + + #border-top { + overflow:hidden; + width: auto; + height: 20px; + font-size:0; + margin-bottom: -15px; + background-image: url(../../images/gfxborder/border_top.gif); + background-repeat:repeat-x; + background-position:top left; + } + + #border-bottom { + overflow:hidden; + width: auto; + height: 20px; + margin-top: -15px; + font-size:0; + background-image: url(../../images/gfxborder/border_bottom.gif); + background-repeat:repeat-x; + background-position:bottom left; + } + + #edge-tl { + float:left; + width: 20px; + height: 20px; + font-size:0; + background-image: url(../../images/gfxborder/corner_tl.gif); + background-position: top left; + } + + #edge-tr { + position:relative; /* IE Fix | z-index */ + float:right; + width: 20px; + height: 20px; + font-size:0; + background-image: url(../../images/gfxborder/corner_tr.gif); + background-position: top right; + } + + #edge-bl { + float:left; + width: 20px; + height: 20px; + background-image: url(../../images/gfxborder/corner_bl.gif); + background-position: bottom left; + } + + #edge-br { + position:relative; /* IE Fix | z-index */ + float:right; + width: 20px; + height: 20px; + background-image: url(../../images/gfxborder/corner_br.gif); + background-position: bottom right; + } + +} diff --git a/htdocs/css/screen/content.css b/htdocs/css/screen/content.css new file mode 100644 index 0000000..47a7bdf --- /dev/null +++ b/htdocs/css/screen/content.css @@ -0,0 +1,218 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Uniform design of standard content elements + * (de) Einheitliche Standardformatierungen für die wichtigten Inhalts-Elemente + * + * @copyright Copyright 2005-2009, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.1 + * @revision $Revision: 343 $ + * @lastmodified $Date: 2009-01-19 23:41:32 +0100 (Mo, 19. Jan 2009) $ + * @appdef yaml + */ + +@media all +{ + /** + * Fonts + * + * (en) global settings of font-families and font-sizes + * (de) Globale Einstellungen für Zeichensatz und Schriftgrößen + * + * @section content-global-settings + */ + + /* (en) reset font size for all elements to standard (16 Pixel) */ + /* (de) Alle Schriftgrößen auf Standardgröße (16 Pixel) zurücksetzen */ + html * { font-size: 100.01%; } + + /** + * (en) reset monospaced elements to font size 16px in all browsers + * (de) Schriftgröße von monospaced Elemente in allen Browsern auf 16 Pixel setzen + * + * @see: http://webkit.org/blog/67/strange-medium/ + */ + + textarea, pre, code, kbd, samp, var, tt { + font-family: Consolas, "Lucida Console", "Andale Mono", "Bitstream Vera Sans Mono", "Courier New", Courier; + } + + /* (en) base layout gets standard font size 12px */ + /* (de) Basis-Layout erhält Standardschriftgröße von 12 Pixeln */ + body { + font-family: Arial, Helvetica, sans-serif; + font-size: 75.00%; + color: #444; + } + + /*--- Headings | Überschriften ------------------------------------------------------------------------*/ + + h1,h2,h3,h4,h5,h6 { + font-family: "Times New Roman", Times, serif; + font-weight:normal; + color:#222; + margin: 0 0 0.25em 0; + } + + h1 { font-size: 250%; } /* 30px */ + h2 { font-size: 200%; } /* 24px */ + h3 { font-size: 150%; } /* 18px */ + h4 { font-size: 133.33%; } /* 16px */ + h5 { font-size: 116.67%; } /* 14px */ + h6 { font-size: 116.67%; } /* 14px */ + + /* --- Lists | Listen -------------------------------------------------------------------------------- */ + + ul, ol, dl { line-height: 1.5em; margin: 0 0 1em 1em; } + ul li { list-style-type: disc; } + ul ul li { list-style-type: circle; } + + ol li { list-style-type: decimal; } + ol ol li { list-style-type: lower-latin; } + + li { margin-left: 0.8em; line-height: 1.5em; } + + dt { font-weight: bold; } + dd { margin: 0 0 1em 0.8em; } + + /* --- general text formatting | Allgemeine Textauszeichnung ------------------------------------------ */ + + p { line-height: 1.5em; margin: 0 0 1em 0; } + + blockquote, cite,q { + font-family: Georgia, "Times New Roman", Times, serif; + font-style:italic; + } + blockquote { margin: 0 0 1em 1.6em; color: #666; } + + strong,b { font-weight: bold; } + em,i { font-style: italic; } + + pre, code, kbd, tt, samp, var { font-size: 100%; } + pre, code { color: #800; } + pre { line-height: 1.5em; margin: 0 0 1em 0; } + kbd, samp, var { color: #666; } + var { font-style: italic; } + + acronym, abbr { + border-bottom: 1px #aaa dotted; + font-variant: small-caps; + letter-spacing: .07em; + cursor: help; + } + + sub, sup { font-size: 91.6667%; } + + hr { + color: #fff; + background:transparent; + margin: 0 0 0.5em 0; + padding: 0 0 0.5em 0; + border:0; + border-bottom: 1px #eee solid; + } + + /*--- Links ----------------------------------------------------------------------------------------- */ + + a { color: #4D87C7; background:transparent; text-decoration:none; } + a:visited { color: #036; } + + a:focus, + a:hover, + a:active { color:#182E7A; text-decoration:underline; } + + /* --- images (with optional captions) | Bilder (mit optionaler Bildunterschrift) ------------------ */ + + p.icaption_left { float:left; display:inline; margin: 0 1em 0.15em 0; } + p.icaption_right { float:right; display:inline; margin: 0 0 0.15em 1em; } + + p.icaption_left img, + p.icaption_right img { padding:0; border: 1px #888 solid; } + + p.icaption_left strong, + p.icaption_right strong { display:block; overflow:hidden; margin-top: 2px; padding: 0.3em 0.5em; background: #eee; font-weight: normal; font-size: 91.667%; } + + /** + * ------------------------------------------------------------------------------------------------- # + * + * Generic Content Classes + * + * (en) standard classes for positioning and highlighting + * (de) Standardklassen zur Positionierung und Hervorhebung + * + * @section content-generic-classes + */ + + .highlight { color: #f60; } + .dimmed { color: #888; } + + .info { background: #f8f8f8; color: #666; padding: 10px; margin-bottom: 0.5em; font-size: 91.7%; } + + .note { background: #efe; color: #040; border: 2px #484 solid; padding: 10px; margin-bottom: 1em; } + .important { background: #ffe; color: #440; border: 2px #884 solid; padding: 10px; margin-bottom: 1em; } + .warning { background: #fee; color: #400; border: 2px #844 solid; padding: 10px; margin-bottom: 1em; } + + .float_left { float: left; display:inline; margin-right: 1em; margin-bottom: 0.15em; } + .float_right { float: right; display:inline; margin-left: 1em; margin-bottom: 0.15em; } + .center { display:block; text-align:center; margin: 0.5em auto; } + + /** + * ------------------------------------------------------------------------------------------------- # + * + * Tables | Tabellen + * + * (en) Generic classes for table-width and design definition + * (de) Generische Klassen für die Tabellenbreite und Gestaltungsvorschriften für Tabellen + * + * @section content-tables + */ + + table { width: auto; border-collapse:collapse; margin-bottom: 0.5em; border-top: 2px #888 solid; border-bottom: 2px #888 solid; } + table caption { font-variant:small-caps; } + table.full { width: 100%; } + table.fixed { table-layout:fixed; } + + th,td { padding: 0.5em; } + thead th { color: #000; border-bottom: 2px #800 solid; } + tbody th { background: #e0e0e0; color: #333; } + tbody th[scope="row"], tbody th.sub { background: #f0f0f0; } + + tbody th { border-bottom: 1px solid #fff; text-align: left; } + tbody td { border-bottom: 1px solid #eee; } + + tbody tr:hover th[scope="row"], + tbody tr:hover tbody th.sub { background: #f0e8e8; } + tbody tr:hover td { background: #fff8f8; } + + /** + * ------------------------------------------------------------------------------------------------- # + * + * Miscellaneous | Sonstiges + * + * @section content-misc + */ + + /** + * (en) Emphasizing external Hyperlinks via CSS + * (de) Hervorhebung externer Hyperlinks mit CSS + * + * @section content-external-links + * @app-yaml-default disabled + */ + + /* + #main a[href^="http://www.my-domain.com"], + #main a[href^="https://www.my-domain.com"] + { + padding-left: 12px; + background-image: url('your_image.gif'); + background-repeat: no-repeat; + background-position: 0 0.45em; + } + */ +} diff --git a/htdocs/images/bg_blue.png b/htdocs/images/bg_blue.png new file mode 100644 index 0000000..191735f Binary files /dev/null and b/htdocs/images/bg_blue.png differ diff --git a/htdocs/images/bg_col_left.png b/htdocs/images/bg_col_left.png new file mode 100644 index 0000000..03fbc77 Binary files /dev/null and b/htdocs/images/bg_col_left.png differ diff --git a/htdocs/images/bg_col_right.png b/htdocs/images/bg_col_right.png new file mode 100644 index 0000000..dca265c Binary files /dev/null and b/htdocs/images/bg_col_right.png differ diff --git a/htdocs/images/gfxborder/border_bottom.gif b/htdocs/images/gfxborder/border_bottom.gif new file mode 100644 index 0000000..b8961f8 Binary files /dev/null and b/htdocs/images/gfxborder/border_bottom.gif differ diff --git a/htdocs/images/gfxborder/border_left.gif b/htdocs/images/gfxborder/border_left.gif new file mode 100644 index 0000000..ebbb3b0 Binary files /dev/null and b/htdocs/images/gfxborder/border_left.gif differ diff --git a/htdocs/images/gfxborder/border_right.gif b/htdocs/images/gfxborder/border_right.gif new file mode 100644 index 0000000..6d8259c Binary files /dev/null and b/htdocs/images/gfxborder/border_right.gif differ diff --git a/htdocs/images/gfxborder/border_top.gif b/htdocs/images/gfxborder/border_top.gif new file mode 100644 index 0000000..fa99708 Binary files /dev/null and b/htdocs/images/gfxborder/border_top.gif differ diff --git a/htdocs/images/gfxborder/corner_bl.gif b/htdocs/images/gfxborder/corner_bl.gif new file mode 100644 index 0000000..4f10b57 Binary files /dev/null and b/htdocs/images/gfxborder/corner_bl.gif differ diff --git a/htdocs/images/gfxborder/corner_br.gif b/htdocs/images/gfxborder/corner_br.gif new file mode 100644 index 0000000..526f19f Binary files /dev/null and b/htdocs/images/gfxborder/corner_br.gif differ diff --git a/htdocs/images/gfxborder/corner_tl.gif b/htdocs/images/gfxborder/corner_tl.gif new file mode 100644 index 0000000..ec927f5 Binary files /dev/null and b/htdocs/images/gfxborder/corner_tl.gif differ diff --git a/htdocs/images/gfxborder/corner_tr.gif b/htdocs/images/gfxborder/corner_tr.gif new file mode 100644 index 0000000..6e35935 Binary files /dev/null and b/htdocs/images/gfxborder/corner_tr.gif differ diff --git a/htdocs/js/ftod.js b/htdocs/js/ftod.js new file mode 100644 index 0000000..1c37f44 --- /dev/null +++ b/htdocs/js/ftod.js @@ -0,0 +1,50 @@ +//filler text on demand +// http://web-graphics.com/mtarchive/001667.php + +var words=new Array('lorem','ipsum','dolor','sit','amet','consectetuer','adipiscing','elit','suspendisse','eget','diam','quis','diam','consequat','interdum'); + +function AddFillerLink(){ +if(!document.getElementById || !document.createElement) return; +var i,l; +for(i=0;i)[^>]*$|^#([\w-]+)$/, + // Is it a simple selector + isSimple = /^.[^:#\[\.,]*$/; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + // Make sure that a selection was provided + selector = selector || document; + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this[0] = selector; + this.length = 1; + this.context = selector; + return this; + } + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + var match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) + selector = jQuery.clean( [ match[1] ], context ); + + // HANDLE: $("#id") + else { + var elem = document.getElementById( match[3] ); + + // Make sure an element was located + if ( elem ){ + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id != match[3] ) + return jQuery().find( selector ); + + // Otherwise, we inject the element directly into the jQuery object + var ret = jQuery( elem ); + ret.context = document; + ret.selector = selector; + return ret; + } + selector = []; + } + + // HANDLE: $(expr, [context]) + // (which is just equivalent to: $(content).find(expr) + } else + return jQuery( context ).find( selector ); + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) + return jQuery( document ).ready( selector ); + + // Make sure that old selector state is passed along + if ( selector.selector && selector.context ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return this.setArray(jQuery.makeArray(selector)); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.3", + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num === undefined ? + + // Return a 'clean' array + jQuery.makeArray( this ) : + + // Return just the object + this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = jQuery( elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) + ret.selector = this.selector + (this.selector ? " " : "") + selector; + else if ( name ) + ret.selector = this.selector + "." + name + "(" + selector + ")"; + + // Return the newly-formed element set + return ret; + }, + + // Force the current matched set of elements to become + // the specified array of elements (destroying the stack in the process) + // You should use pushStack() in order to do this, but maintain the stack + setArray: function( elems ) { + // Resetting the length to 0, then using the native Array push + // is a super-fast way to populate an object with array-like properties + this.length = 0; + Array.prototype.push.apply( this, elems ); + + return this; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem && elem.jquery ? elem[0] : elem + , this ); + }, + + attr: function( name, value, type ) { + var options = name; + + // Look for the case where we're accessing a style value + if ( typeof name === "string" ) + if ( value === undefined ) + return this[0] && jQuery[ type || "attr" ]( this[0], name ); + + else { + options = {}; + options[ name ] = value; + } + + // Check to see if we're setting style values + return this.each(function(i){ + // Set all the styles + for ( name in options ) + jQuery.attr( + type ? + this.style : + this, + name, jQuery.prop( this, options[ name ], type, i, name ) + ); + }); + }, + + css: function( key, value ) { + // ignore negative width and height values + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) + value = undefined; + return this.attr( key, value, "curCSS" ); + }, + + text: function( text ) { + if ( typeof text !== "object" && text != null ) + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + + var ret = ""; + + jQuery.each( text || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + ret += this.nodeType != 1 ? + this.nodeValue : + jQuery.fn.text( [ this ] ); + }); + }); + + return ret; + }, + + wrapAll: function( html ) { + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).clone(); + + if ( this[0].parentNode ) + wrap.insertBefore( this[0] ); + + wrap.map(function(){ + var elem = this; + + while ( elem.firstChild ) + elem = elem.firstChild; + + return elem; + }).append(this); + } + + return this; + }, + + wrapInner: function( html ) { + return this.each(function(){ + jQuery( this ).contents().wrapAll( html ); + }); + }, + + wrap: function( html ) { + return this.each(function(){ + jQuery( this ).wrapAll( html ); + }); + }, + + append: function() { + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.appendChild( elem ); + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.insertBefore( elem, this.firstChild ); + }); + }, + + before: function() { + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this ); + }); + }, + + after: function() { + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + }, + + end: function() { + return this.prevObject || jQuery( [] ); + }, + + // For internal use only. + // Behaves like an Array's .push method, not like a jQuery method. + push: [].push, + + find: function( selector ) { + if ( this.length === 1 && !/,/.test(selector) ) { + var ret = this.pushStack( [], "find", selector ); + ret.length = 0; + jQuery.find( selector, this[0], ret ); + return ret; + } else { + var elems = jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + }); + + return this.pushStack( /[^+>] [^+>]/.test( selector ) ? + jQuery.unique( elems ) : + elems, "find", selector ); + } + }, + + clone: function( events ) { + // Do the clone + var ret = this.map(function(){ + if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { + // IE copies events bound via attachEvent when + // using cloneNode. Calling detachEvent on the + // clone will also remove the events from the orignal + // In order to get around this, we use innerHTML. + // Unfortunately, this means some modifications to + // attributes in IE that are actually only stored + // as properties will not be copied (such as the + // the name attribute on an input). + var clone = this.cloneNode(true), + container = document.createElement("div"); + container.appendChild(clone); + return jQuery.clean([container.innerHTML])[0]; + } else + return this.cloneNode(true); + }); + + // Need to set the expando to null on the cloned set if it exists + // removeData doesn't work here, IE removes it from the original as well + // this is primarily for IE but the data expando shouldn't be copied over in any browser + var clone = ret.find("*").andSelf().each(function(){ + if ( this[ expando ] !== undefined ) + this[ expando ] = null; + }); + + // Copy the events from the original to the clone + if ( events === true ) + this.find("*").andSelf().each(function(i){ + if (this.nodeType == 3) + return; + var events = jQuery.data( this, "events" ); + + for ( var type in events ) + for ( var handler in events[ type ] ) + jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data ); + }); + + // Return the cloned set + return ret; + }, + + filter: function( selector ) { + return this.pushStack( + jQuery.isFunction( selector ) && + jQuery.grep(this, function(elem, i){ + return selector.call( elem, i ); + }) || + + jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ + return elem.nodeType === 1; + }) ), "filter", selector ); + }, + + closest: function( selector ) { + var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null; + + return this.map(function(){ + var cur = this; + while ( cur && cur.ownerDocument ) { + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) + return cur; + cur = cur.parentNode; + } + }); + }, + + not: function( selector ) { + if ( typeof selector === "string" ) + // test special case where just one selector is passed in + if ( isSimple.test( selector ) ) + return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); + else + selector = jQuery.multiFilter( selector, this ); + + var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; + return this.filter(function() { + return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; + }); + }, + + add: function( selector ) { + return this.pushStack( jQuery.unique( jQuery.merge( + this.get(), + typeof selector === "string" ? + jQuery( selector ) : + jQuery.makeArray( selector ) + ))); + }, + + is: function( selector ) { + return !!selector && jQuery.multiFilter( selector, this ).length > 0; + }, + + hasClass: function( selector ) { + return !!selector && this.is( "." + selector ); + }, + + val: function( value ) { + if ( value === undefined ) { + var elem = this[0]; + + if ( elem ) { + if( jQuery.nodeName( elem, 'option' ) ) + return (elem.attributes.value || {}).specified ? elem.value : elem.text; + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type == "select-one"; + + // Nothing was selected + if ( index < 0 ) + return null; + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) + return value; + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + } + + // Everything else, we just grab the value + return (elem.value || "").replace(/\r/g, ""); + + } + + return undefined; + } + + if ( typeof value === "number" ) + value += ''; + + return this.each(function(){ + if ( this.nodeType != 1 ) + return; + + if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) ) + this.checked = (jQuery.inArray(this.value, value) >= 0 || + jQuery.inArray(this.name, value) >= 0); + + else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(value); + + jQuery( "option", this ).each(function(){ + this.selected = (jQuery.inArray( this.value, values ) >= 0 || + jQuery.inArray( this.text, values ) >= 0); + }); + + if ( !values.length ) + this.selectedIndex = -1; + + } else + this.value = value; + }); + }, + + html: function( value ) { + return value === undefined ? + (this[0] ? + this[0].innerHTML : + null) : + this.empty().append( value ); + }, + + replaceWith: function( value ) { + return this.after( value ).remove(); + }, + + eq: function( i ) { + return this.slice( i, +i + 1 ); + }, + + slice: function() { + return this.pushStack( Array.prototype.slice.apply( this, arguments ), + "slice", Array.prototype.slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function(elem, i){ + return callback.call( elem, i, elem ); + })); + }, + + andSelf: function() { + return this.add( this.prevObject ); + }, + + domManip: function( args, table, callback ) { + if ( this[0] ) { + var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), + scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), + first = fragment.firstChild, + extra = this.length > 1 ? fragment.cloneNode(true) : fragment; + + if ( first ) + for ( var i = 0, l = this.length; i < l; i++ ) + callback.call( root(this[i], first), i > 0 ? extra.cloneNode(true) : fragment ); + + if ( scripts ) + jQuery.each( scripts, evalScript ); + } + + return this; + + function root( elem, cur ) { + return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; + } + } +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +function evalScript( i, elem ) { + if ( elem.src ) + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + + else + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + + if ( elem.parentNode ) + elem.parentNode.removeChild( elem ); +} + +function now(){ + return +new Date; +} + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) + target = {}; + + // extend jQuery itself if only one argument is passed + if ( length == i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) + // Extend the base object + for ( var name in options ) { + var src = target[ name ], copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) + continue; + + // Recurse if we're merging object values + if ( deep && copy && typeof copy === "object" && !copy.nodeType ) + target[ name ] = jQuery.extend( deep, + // Never move original objects, clone them + src || ( copy.length != null ? [ ] : { } ) + , copy ); + + // Don't bring in undefined values + else if ( copy !== undefined ) + target[ name ] = copy; + + } + + // Return the modified object + return target; +}; + +// exclude the following css properties to add px +var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}, + toString = Object.prototype.toString; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) + window.jQuery = _jQuery; + + return jQuery; + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return toString.call(obj) === "[object Function]"; + }, + + isArray: function( obj ) { + return toString.call(obj) === "[object Array]"; + }, + + // check if an element is in a (or is an) XML document + isXMLDoc: function( elem ) { + return elem.documentElement && !elem.body || + elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; + }, + + // Evalulates a script in a global context + globalEval: function( data ) { + data = jQuery.trim( data ); + + if ( data ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + if ( jQuery.support.scriptEval ) + script.appendChild( document.createTextNode( data ) ); + else + script.text = data; + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, length = object.length; + + if ( args ) { + if ( length === undefined ) { + for ( name in object ) + if ( callback.apply( object[ name ], args ) === false ) + break; + } else + for ( ; i < length; ) + if ( callback.apply( object[ i++ ], args ) === false ) + break; + + // A special, fast, case for the most common use of each + } else { + if ( length === undefined ) { + for ( name in object ) + if ( callback.call( object[ name ], name, object[ name ] ) === false ) + break; + } else + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} + } + + return object; + }, + + prop: function( elem, value, type, i, name ) { + // Handle executable functions + if ( jQuery.isFunction( value ) ) + value = value.call( elem, i ); + + // Handle passing in a number to a CSS property + return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ? + value + "px" : + value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, classNames ) { + jQuery.each((classNames || "").split(/\s+/), function(i, className){ + if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) + elem.className += (elem.className ? " " : "") + className; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, classNames ) { + if (elem.nodeType == 1) + elem.className = classNames !== undefined ? + jQuery.grep(elem.className.split(/\s+/), function(className){ + return !jQuery.className.has( classNames, className ); + }).join(" ") : + ""; + }, + + // internal only, use hasClass("class") + has: function( elem, className ) { + return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( var name in options ) + elem.style[ name ] = old[ name ]; + }, + + css: function( elem, name, force ) { + if ( name == "width" || name == "height" ) { + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; + + function getWH() { + val = name == "width" ? elem.offsetWidth : elem.offsetHeight; + var padding = 0, border = 0; + jQuery.each( which, function() { + padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; + border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; + }); + val -= Math.round(padding + border); + } + + if ( jQuery(elem).is(":visible") ) + getWH(); + else + jQuery.swap( elem, props, getWH ); + + return Math.max(0, val); + } + + return jQuery.curCSS( elem, name, force ); + }, + + curCSS: function( elem, name, force ) { + var ret, style = elem.style; + + // We need to handle opacity special in IE + if ( name == "opacity" && !jQuery.support.opacity ) { + ret = jQuery.attr( style, "opacity" ); + + return ret == "" ? + "1" : + ret; + } + + // Make sure we're using the right name for getting the float value + if ( name.match( /float/i ) ) + name = styleFloat; + + if ( !force && style && style[ name ] ) + ret = style[ name ]; + + else if ( defaultView.getComputedStyle ) { + + // Only "float" is needed here + if ( name.match( /float/i ) ) + name = "float"; + + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); + + var computedStyle = defaultView.getComputedStyle( elem, null ); + + if ( computedStyle ) + ret = computedStyle.getPropertyValue( name ); + + // We should always get a number back from opacity + if ( name == "opacity" && ret == "" ) + ret = "1"; + + } else if ( elem.currentStyle ) { + var camelCase = name.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = ret || 0; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + + return ret; + }, + + clean: function( elems, context, fragment ) { + context = context || document; + + // !context.createElement fails in IE with an error but returns typeof 'object' + if ( typeof context.createElement === "undefined" ) + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) { + var match = /^<(\w+)\s*\/?>$/.exec(elems[0]); + if ( match ) + return [ context.createElement( match[1] ) ]; + } + + var ret = [], scripts = [], div = context.createElement("div"); + + jQuery.each(elems, function(i, elem){ + if ( typeof elem === "number" ) + elem += ''; + + if ( !elem ) + return; + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? + all : + front + ">"; + }); + + // Trim whitespace, otherwise indexOf won't work as expected + var tags = jQuery.trim( elem ).toLowerCase(); + + var wrap = + // option or optgroup + !tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && + [ 1, "", "
" ] || + + !tags.indexOf("", "" ] || + + // matched above + (!tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + // IE can't serialize and + + + +
+
+
+
+
+
+ + +
+
+
+ + {% block LeftColumn %} + {% endblock %} +
+
+
+
+ + {% block Content %} + {% endblock %} +
+ +
 
+
+
+ + +
+
+
+
+
+
+ + diff --git a/template/mumble/content.htm b/template/mumble/content.htm index d4c7bd5..fa63a81 100644 --- a/template/mumble/content.htm +++ b/template/mumble/content.htm @@ -1,37 +1,38 @@ {% load mumble_extras %} -
- +
+
+ {% for item in ChannelTable %} {% endfor %}
mumble {{ ServerObject.rootName }}
- - {% spaceless %} - {% for num in item.0|mrange %} - | - {% endfor %} - +- - {% endspaceless %} - {% if item.1.userid %} - player - {{ item.1.name }} - {% else %} - {% if item.1.linked %} - linked channel - {% else %} - channel - {% endif %} - {{ item.1.name }} - {% endif %} - + + {% spaceless %} + {% for num in item.0|mrange %} + | + {% endfor %} + +- + {% endspaceless %} + {% if item.1.userid %} + player + {{ item.1.name }} + {% else %} + {% if item.1.linked %} + linked channel + {% else %} + channel + {% endif %} + {{ item.1.name }} + {% endif %} + {% if item.1.userid %} @@ -55,8 +56,4 @@
-

Manage Account

- {% if CurrentUserIsAdmin %} -

Manage Server settings

- {% endif %}
diff --git a/template/mumble/list.htm b/template/mumble/list.htm index ecfd059..fe0d4e1 100644 --- a/template/mumble/list.htm +++ b/template/mumble/list.htm @@ -1,6 +1,6 @@ -{% extends "base.htm" %} +{% extends "index.htm" %} {% load mumble_extras %} -{% block content %} +{% block Content %}

Configured Mumble Servers

    diff --git a/template/mumble/mumble.htm b/template/mumble/mumble.htm index fecb7ec..b668a49 100644 --- a/template/mumble/mumble.htm +++ b/template/mumble/mumble.htm @@ -1,10 +1,42 @@ -{% extends "base.htm" %} -{% block modelstyle %} - {% include "mumble/style.htm" %} -{% endblock %} +{% extends "index.htm" %} {% block headtags %} {% endblock %} -{% block content %} - {% include "mumble/content.htm" %} +{% block Headline %} + {{ ServerObject.rootName }} +{% endblock %} +{% block LeftColumn %} + {% include "mumble/content.htm" %} +{% endblock %} +{% block Content %} + {% if user.is_authenticated %} +
    +

    Server registration

    +
    + + {{ RegForm }} +
    + + +
    +
    + {% else %} + not admin... + {% endif %} + + {% if CurrentUserIsAdmin %} +
    +

    Server administration

    +
    + + {{ AdminForm }} +
    + + +
    +
    + {% else %} + not admin... + {% endif %} + {% endblock %} diff --git a/template/mumble/style.htm b/template/mumble/style.htm deleted file mode 100644 index 8b13789..0000000 --- a/template/mumble/style.htm +++ /dev/null @@ -1 +0,0 @@ - diff --git a/template/registration/login.html b/template/registration/login.html index 178705d..5ed171b 100644 --- a/template/registration/login.html +++ b/template/registration/login.html @@ -1,9 +1,9 @@ -{% extends "base.htm" %} +{% extends "index.htm" %} {% load i18n %} -{% block title %}Login{% endblock %} +{% block Headline %}Login{% endblock %} -{% block content %} +{% block Content %}

    Login

    diff --git a/template/registration/profile.html b/template/registration/profile.html index d886e81..fea981d 100644 --- a/template/registration/profile.html +++ b/template/registration/profile.html @@ -1,9 +1,9 @@ -{% extends "base.htm" %} +{% extends "index.htm" %} {% load i18n %} -{% block title %}Profil{% endblock %} +{% block Headline %}Profil{% endblock %} -{% block content %} +{% block Content %}

    Profil von {{user|capfirst}}

    Statistics