+++ /dev/null
-// $Id: autocomplete.js 144 2007-03-28 07:52:20Z thierry $
-
-// Global Killswitch
-if (isJsEnabled()) {
- addLoadEvent(autocompleteAutoAttach);
-}
-
-/**
- * Attaches the autocomplete behaviour to all required fields
- */
-function autocompleteAutoAttach() {
- var acdb = [];
- var inputs = document.getElementsByTagName('input');
- for (i = 0; input = inputs[i]; i++) {
- if (input && hasClass(input, 'autocomplete')) {
- uri = input.value;
- if (!acdb[uri]) {
- acdb[uri] = new ACDB(uri);
- }
- input = $(input.id.substr(0, input.id.length - 13));
- input.setAttribute('autocomplete', 'OFF');
- addSubmitEvent(input.form, autocompleteSubmit);
- new jsAC(input, acdb[uri]);
- }
- }
-}
-
-/**
- * Prevents the form from submitting if the suggestions popup is open
- */
-function autocompleteSubmit() {
- var popup = document.getElementById('autocomplete');
- if (popup) {
- popup.owner.hidePopup();
- return false;
- }
- return true;
-}
-
-
-/**
- * An AutoComplete object
- */
-function jsAC(input, db) {
- var ac = this;
- this.input = input;
- this.db = db;
- this.input.onkeydown = function (event) { return ac.onkeydown(this, event); };
- this.input.onkeyup = function (event) { ac.onkeyup(this, event) };
- this.input.onblur = function () { ac.hidePopup(); ac.db.cancel(); };
- this.popup = document.createElement('div');
- this.popup.id = 'autocomplete';
- this.popup.owner = this;
-};
-
-/**
- * Hides the autocomplete suggestions
- */
-jsAC.prototype.hidePopup = function (keycode) {
- if (this.selected && ((keycode && keycode != 46 && keycode != 8 && keycode != 27) || !keycode)) {
- this.input.value = this.selected.autocompleteValue;
- }
- if (this.popup.parentNode && this.popup.parentNode.tagName) {
- removeNode(this.popup);
- }
- this.selected = false;
-}
-
-
-/**
- * Handler for the "keydown" event
- */
-jsAC.prototype.onkeydown = function (input, e) {
- if (!e) {
- e = window.event;
- }
- switch (e.keyCode) {
- case 40: // down arrow
- this.selectDown();
- return false;
- case 38: // up arrow
- this.selectUp();
- return false;
- default: // all other keys
- return true;
- }
-}
-
-/**
- * Handler for the "keyup" event
- */
-jsAC.prototype.onkeyup = function (input, e) {
- if (!e) {
- e = window.event;
- }
- switch (e.keyCode) {
- case 16: // shift
- case 17: // ctrl
- case 18: // alt
- case 20: // caps lock
- case 33: // page up
- case 34: // page down
- case 35: // end
- case 36: // home
- case 37: // left arrow
- case 38: // up arrow
- case 39: // right arrow
- case 40: // down arrow
- return true;
-
- case 9: // tab
- case 13: // enter
- case 27: // esc
- this.hidePopup(e.keyCode);
- return true;
-
- default: // all other keys
- if (input.value.length > 0)
- this.populatePopup();
- else
- this.hidePopup(e.keyCode);
- return true;
- }
-}
-
-/**
- * Puts the currently highlighted suggestion into the autocomplete field
- */
-jsAC.prototype.select = function (node) {
- this.input.value = node.autocompleteValue;
-}
-
-/**
- * Highlights the next suggestion
- */
-jsAC.prototype.selectDown = function () {
- if (this.selected && this.selected.nextSibling) {
- this.highlight(this.selected.nextSibling);
- }
- else {
- var lis = this.popup.getElementsByTagName('li');
- if (lis.length > 0) {
- this.highlight(lis[0]);
- }
- }
-}
-
-/**
- * Highlights the previous suggestion
- */
-jsAC.prototype.selectUp = function () {
- if (this.selected && this.selected.previousSibling) {
- this.highlight(this.selected.previousSibling);
- }
-}
-
-/**
- * Highlights a suggestion
- */
-jsAC.prototype.highlight = function (node) {
- removeClass(this.selected, 'selected');
- addClass(node, 'selected');
- this.selected = node;
-}
-
-/**
- * Unhighlights a suggestion
- */
-jsAC.prototype.unhighlight = function (node) {
- removeClass(node, 'selected');
- this.selected = false;
-}
-
-/**
- * Positions the suggestions popup and starts a search
- */
-jsAC.prototype.populatePopup = function () {
- var ac = this;
- var pos = absolutePosition(this.input);
- this.selected = false;
- this.popup.style.top = (pos.y + this.input.offsetHeight) +'px';
- this.popup.style.left = pos.x +'px';
- this.popup.style.width = (this.input.offsetWidth - 4) +'px';
- this.db.owner = this;
- this.db.search(this.input.value);
-}
-
-/**
- * Fills the suggestion popup with any matches received
- */
-jsAC.prototype.found = function (matches) {
- while (this.popup.hasChildNodes()) {
- this.popup.removeChild(this.popup.childNodes[0]);
- }
- if (!this.popup.parentNode || !this.popup.parentNode.tagName) {
- document.getElementsByTagName('body')[0].appendChild(this.popup);
- }
- var ul = document.createElement('ul');
- var ac = this;
-
- for (key in matches) {
- var li = document.createElement('li');
- var div = document.createElement('div');
- div.innerHTML = matches[key];
- li.appendChild(div);
- li.autocompleteValue = key;
- li.onmousedown = function() { ac.select(this); };
- li.onmouseover = function() { ac.highlight(this); };
- li.onmouseout = function() { ac.unhighlight(this); };
- ul.appendChild(li);
- }
-
- if (ul.childNodes.length > 0) {
- this.popup.appendChild(ul);
- }
- else {
- this.hidePopup();
- }
- removeClass(this.input, 'throbbing');
-}
-
-/**
- * An AutoComplete DataBase object
- */
-function ACDB(uri) {
- this.uri = uri;
- this.delay = 300;
- this.cache = {};
-}
-
-/**
- * Performs a cached and delayed search
- */
-ACDB.prototype.search = function(searchString) {
- this.searchString = searchString;
- if (this.cache[searchString]) {
- return this.owner.found(this.cache[searchString]);
- }
- if (this.timer) {
- clearTimeout(this.timer);
- }
- var db = this;
- this.timer = setTimeout(function() {
- addClass(db.owner.input, 'throbbing');
- db.transport = HTTPGet(db.uri +'/'+ encodeURIComponent(searchString), db.receive, db);
- }, this.delay);
-}
-
-/**
- * HTTP callback function. Passes suggestions to the autocomplete object
- */
-ACDB.prototype.receive = function(string, xmlhttp, acdb) {
- // Note: Safari returns 'undefined' status if the request returns no data.
- if (xmlhttp.status != 200 && typeof xmlhttp.status != 'undefined') {
- removeClass(acdb.owner.input, 'throbbing');
- return alert('An HTTP error '+ xmlhttp.status +' occured.\n'+ acdb.uri);
- }
- // Parse back result
- var matches = parseJson(string);
- if (typeof matches['status'] == 'undefined' || matches['status'] != 0) {
- acdb.cache[acdb.searchString] = matches;
- acdb.owner.found(matches);
- }
-}
-
-/**
- * Cancels the current autocomplete request
- */
-ACDB.prototype.cancel = function() {
- if (this.owner) removeClass(this.owner.input, 'throbbing');
- if (this.timer) clearTimeout(this.timer);
- if (this.transport) {
- this.transport.onreadystatechange = function() {};
- this.transport.abort();
- }
-}
+++ /dev/null
-// $Id: collapse.js 144 2007-03-28 07:52:20Z thierry $
-
-if (isJsEnabled()) {
- addLoadEvent(collapseAutoAttach);
-}
-
-function collapseAutoAttach() {
- var fieldsets = document.getElementsByTagName('fieldset');
- var legend, fieldset;
- for (var i = 0; fieldset = fieldsets[i]; i++) {
- if (!hasClass(fieldset, 'collapsible')) {
- continue;
- }
- legend = fieldset.getElementsByTagName('legend');
- if (legend.length == 0) {
- continue;
- }
- legend = legend[0];
- var a = document.createElement('a');
- a.href = '#';
- a.onclick = function() {
- toggleClass(this.parentNode.parentNode, 'collapsed');
- if (!hasClass(this.parentNode.parentNode, 'collapsed')) {
- collapseScrollIntoView(this.parentNode.parentNode);
- if (typeof textAreaAutoAttach != 'undefined') {
- // Add the grippie to a textarea in a collapsed fieldset.
- textAreaAutoAttach(null, this.parentNode.parentNode);
- }
- }
- this.blur();
- return false;
- };
- a.innerHTML = legend.innerHTML;
- while (legend.hasChildNodes()) {
- removeNode(legend.childNodes[0]);
- }
- legend.appendChild(a);
- collapseEnsureErrorsVisible(fieldset);
- }
-}
-
-function collapseEnsureErrorsVisible(fieldset) {
- if (!hasClass(fieldset, 'collapsed')) {
- return;
- }
- var inputs = [];
- inputs = inputs.concat(fieldset.getElementsByTagName('input'));
- inputs = inputs.concat(fieldset.getElementsByTagName('textarea'));
- inputs = inputs.concat(fieldset.getElementsByTagName('select'));
- for (var j = 0; j<3; j++) {
- for (var i = 0; i < inputs[j].length; i++) {
- if (hasClass(inputs[j][i], 'error')) {
- return removeClass(fieldset, 'collapsed');
- }
- }
- }
-}
-
-function collapseScrollIntoView(node) {
- var h = self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight || 0;
- var offset = self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
- var pos = absolutePosition(node);
- if (pos.y + node.scrollHeight > h + offset) {
- if (node.scrollHeight > h) {
- window.scrollTo(0, pos.y);
- } else {
- window.scrollTo(0, pos.y + node.scrollHeight - h);
- }
- }
-}
+++ /dev/null
-/* $Id: drupal.css 144 2007-03-28 07:52:20Z thierry $ */
-
-/*
-** HTML elements
-*/
-fieldset {
- margin-bottom: 1em;
- padding: .5em;
-}
-form {
- margin: 0;
- padding: 0;
-}
-hr {
- height: 1px;
- border: 1px solid gray;
-}
-img {
- border: 0;
-}
-table {
- border-collapse: collapse;
-}
-th {
- text-align: left;
- padding-right: 1em;
- border-bottom: 3px solid #ccc;
-}
-th.active img {
- display: inline;
-}
-tr.even, tr.odd {
- background-color: #eee;
- border-bottom: 1px solid #ccc;
-}
-tr.even, tr.odd {
- padding: 0.1em 0.6em;
-}
-td.active {
- background-color: #ddd;
-}
-
-/*
-** Menu styles
-*/
-ul.menu {
- list-style: none;
- border: none;
- text-align:left;
-}
-ul.menu li {
- margin: 0 0 0 0.5em;
-}
-li.expanded {
- list-style-type: circle;
- list-style-image: url(menu-expanded.png);
- padding: 0.2em 0.5em 0 0;
- margin: 0;
-}
-li.collapsed {
- list-style-type: disc;
- list-style-image: url(menu-collapsed.png);
- padding: 0.2em 0.5em 0 0;
- margin: 0;
-}
-li.leaf {
- list-style-type: square;
- list-style-image: url(menu-leaf.png);
- padding: 0.2em 0.5em 0 0;
- margin: 0;
-}
-li a.active {
- color: #000;
-}
-td.menu-disabled {
- background: #ccc;
-}
-
-/*
-** Other common styles
-*/
-.breadcrumb {
- padding-bottom: .5em
-}
-.block-region {
- background-color: #ffff66;
- margin-top: 4px;
- margin-bottom: 4px;
- padding: 3px;
-}
-.block ul {
- margin: 0;
- padding: 0 0 0.25em 1em;
-}
-br.clear {
- clear: both;
- height: 0;
-}
-.container-inline div {
- display: inline;
-}
-.error {
- color: red;
-}
-.item-list .icon {
- color: #555;
- float: right;
- padding-left: 0.25em;
- clear: right;
-}
-.item-list .icon a {
- color: #000;
- text-decoration: none;
-}
-.item-list .icon a:hover {
- color: #000;
- text-decoration: none;
-}
-.item-list .title {
- font-weight: bold;
-}
-.item-list ul {
- margin: 0 0 0.75em 0;
- padding: 0;
-}
-.item-list ul li {
- margin: 0 0 0.25em 1.5em;
- padding: 0;
- list-style: disc;
-}
-.form-item {
- margin-top: 1em;
- margin-bottom: 1em;
-}
-tr.odd .form-item, tr.even .form-item {
- margin-top: 0;
- margin-bottom: 0;
- white-space: nowrap;
-}
-.form-item input.error, .form-item textarea.error {
- border: 2px solid red;
-}
-.form-item .description {
- font-size: 0.85em;
-}
-.form-item label {
- display: block;
- font-weight: bold;
-}
-.form-item label.option {
- display: inline;
- font-weight: normal;
-}
-.marker, .form-required {
- color: #f00;
-}
-.more-link {
- text-align: right;
-}
-.node-form .form-text {
- display: block;
- width: 95%;
-}
-.node-form .standard {
- clear: both;
-}
-.node-form textarea {
- display: block;
- width: 95%;
-}
-.node-form .attachments fieldset {
- float: none;
- display: block;
-}
-.nowrap {
- white-space: nowrap;
-}
-.ok {
- color: #080;
-}
-#pager {
- clear: both;
- text-align: center;
-}
-#pager a, #pager strong.pager-current {
- padding: 0.5em;
-}
-.path {
- padding-bottom: 0.7em;
- font-size: 1.1em;
-}
-
-/*
-** Module specific styles
-*/
-#aggregator .feed-source .feed-title {
- margin-top: 0;
-}
-#aggregator .feed-source .feed-image img {
- margin-bottom: 0.75em;
-}
-#aggregator .feed-source .feed-icon {
- float: right;
- display: block;
-}
-#aggregator .feed-item {
- margin-bottom: 1.5em;
-}
-#aggregator .feed-item-title {
- margin-bottom: 0;
- font-size: 1.3em;
-}
-#aggregator .feed-item-meta, #aggregator .feed-item-body {
- margin-bottom: 0.5em;
-}
-#aggregator .feed-item-categories {
- font-size: 0.9em;
-}
-#aggregator td {
- vertical-align: bottom;
-}
-#aggregator td.categorize-item {
- white-space: nowrap;
-}
-#aggregator .categorize-item .news-item .body {
- margin-top: 0;
-}
-#aggregator .categorize-item h3 {
- margin-bottom: 1em;
- margin-top: 0;
-}
-.book-navigation .menu {
- border-top: 1px solid #888;
- padding: 1em 0 0 3em;
-}
-.book-navigation .page-links {
- border-top: 1px solid #888;
- border-bottom: 1px solid #888;
- text-align: center;
- padding: 0.5em;
-}
-.book-navigation .page-previous {
- text-align: right;
-}
-.book-navigation .page-up {
- margin: 0 4em;
-}
-.book-navigation .page-next {
- text-align: left;
-}
-.node-unpublished, .comment-unpublished {
- background-color: #fff4f4;
-}
-.preview .node, .preview .comment {
- background-color: #ffffea;
-}
-.archive {
- margin: 1em 0 1em 0;
-}
-.calendar .row-week td a {
- display: block;
-}
-.calendar .row-week td a:hover {
- background-color: #888; color: #fff;
-}
-.calendar a {
- text-decoration: none;
-}
-.calendar a:hover {
- text-decoration: none;
-}
-.calendar table {
- border-collapse: collapse;
- width: 100%;
- border: 1px solid #000;
-}
-.calendar td, .calendar th {
- text-align: center;
- border: 1px solid #000;
- padding: 1px;
- margin: 0;
- font-size: 0.8em;
-}
-.calendar td.day-blank {
- border: 0;
-}
-.tips {
- margin-top: 0;
- margin-bottom: 0;
- padding-top: 0;
- padding-bottom: 0;
- font-size: 0.9em;
-}
-#forum .description {
- font-size: 0.9em;
- margin: 0.5em;
-}
-#forum td.created, #forum td.posts, #forum td.topics, #forum td.last-reply, #forum td.replies, #forum td.pager {
- white-space: nowrap;
-}
-#forum td.posts, #forum td.topics, #forum td.replies, #forum td.pager {
- text-align: center;
-}
-.forum-topic-navigation {
- padding: 1em 0 0 3em;
- border-top: 1px solid #888;
- border-bottom: 1px solid #888;
- text-align: center;
- padding: 0.5em;
-}
-.forum-topic-navigation .topic-previous {
- margin-right: 4em;
- text-align: right;
-}
-.forum-topic-navigation .topic-next {
- text-align: left;
-}
-.locale-untranslated {
- font-style: normal;
- text-decoration: line-through;
-}
-#node-admin-filter ul {
- list-style-type: none;
- padding: 0;
- margin: 0;
- width: 100%;
-}
-#node-admin-buttons {
- float: left;
- margin-left: 0.5em;
- clear: right;
-}
-td.revision-current {
- background: #ffc;
-}
-dl.multiselect dd.b, dl.multiselect dd.b .form-item, dl.multiselect dd.b select {
- font-family: inherit;
- font-size: inherit;
- width: 14em;
-}
-dl.multiselect dd.a, dl.multiselect dd.a .form-item {
- width: 8em;
-}
-dl.multiselect dt, dl.multiselect dd {
- float: left;
- line-height: 1.75em;
- padding: 0;
- margin: 0 1em 0 0;
-}
-dl.multiselect .form-item {
- height: 1.75em;
- margin: 0;
-}
-#permissions td.module, #blocks td.region {
- font-weight: bold;
-}
-#permissions td.permission, #blocks td.block, #taxonomy td.term, #taxonomy td.message {
- padding-left: 1.5em;
-}
-
-#access-rules .access-type, #access-rules .rule-type {
- margin-right: 1em;
- float: left;
-}
-#access-rules .access-type .form-item, #access-rules .rule-type .form-item {
- margin-top: 0;
-}
-#access-rules .mask {
- clear: both;
-}
-.poll .bar {
- height: 1em;
- margin: 1px 0;
- background-color: #ddd;
-}
-.poll .bar .foreground {
- background-color: #000;
- height: 1em;
- clear: left;
- float: left;
-}
-.poll .links {
- text-align: center;
-}
-.poll .percent {
- text-align: right;
-}
-.poll .total {
- text-align: center;
-}
-.poll .vote-form {
- text-align: center;
-}
-.poll .vote-form .choices {
- text-align: left;
- margin: 0 auto;
- display: table;
-}
-.profile {
- clear: both;
- margin: 1em 0 1em 0;
-}
-.profile .picture {
- float: right;
- margin: 0 1em 1em 0;
-}
-.profile dt {
- margin: 1em 0 0.2em 0;
- font-weight: bold;
-}
-.profile dd {
- margin:0;
-}
-.node-form .poll-form fieldset {
- display: block;
-}
-img.screenshot {
- border: 1px solid #808080;
- display: block;
- margin: 2px;
-}
-.search-form {
- margin-bottom: 1em;
-}
-.search-form p {
- margin-top: 0;
- margin-bottom: 0.2em;
- padding-top: 0;
- padding-bottom: 0;
-}
-.search-form input {
- margin-top: 0;
- margin-bottom: 0;
-}
-.search-results p {
- margin-top: 0;
-}
-.search-results dt {
- font-size: 1.1em;
-}
-.search-results dd {
- margin-bottom: 1em;
-}
-.search-results .search-info {
- font-size: 0.85em;
-}
-.search-advanced .criterion {
- float: left;
- margin-right: 2em;
-}
-.search-advanced .action {
- float: left;
- clear: left;
-}
-#tracker td.replies {
- text-align: center;
-}
-#tracker table {
- width: 100%;
-}
-.theme-settings-left {
- float: left;
- width: 49%;
-}
-.theme-settings-right {
- float: right;
- width: 49%;
-}
-.theme-settings-bottom {
- clear: both;
-}
-#user-login-form {
- text-align: center;
-}
-.more-help-link {
- font-size: 0.85em;
- text-align: right;
-}
-table.watchdog-event th {
- border-bottom: 1px solid #ccc;
-}
-tr.watchdog-user {
- background: #ffd;
-}
-tr.watchdog-user .active {
- background: #eed;
-}
-tr.watchdog-content {
- background: #ddf;
-}
-tr.watchdog-content .active {
- background: #cce;
-}
-tr.watchdog-page-not-found, tr.watchdog-access-denied {
- background: #dfd;
-}
-tr.watchdog-page-not-found .active, tr.watchdog-access-denied .active {
- background: #cec;
-}
-tr.watchdog-error {
- background: #ffc9c9;
-}
-tr.watchdog-error .active {
- background: #eeb9b9;
-}
-
-/* Tab navigation */
-ul.primary {
- border-collapse: collapse;
- padding: 0 0 0 1em;
- white-space: nowrap;
- list-style: none;
- margin: 5px;
- height: auto;
- line-height: normal;
- border-bottom: 1px solid #bbb;
-}
-ul.primary li {
- display: inline;
-}
-ul.primary li a {
- background-color: #ddd;
- border-color: #bbb;
- border-width: 1px;
- border-style: solid solid none solid;
- height: auto;
- margin-right: 0.5em;
- padding: 0 1em;
- text-decoration: none;
-}
-ul.primary li.active a {
- background-color: #fff;
- border: 1px solid #bbb;
- border-bottom: #fff 1px solid;
-}
-ul.primary li a:hover {
- background-color: #eee;
- border-color: #ccc;
- border-bottom-color: #eee;
-}
-ul.secondary {
- border-bottom: 1px solid #bbb;
- padding: 0.5em 1em 0.5em 1em;
- margin: 5px;
-}
-ul.secondary li {
- display: inline;
- padding: 0 1em;
- border-right: 1px solid #ccc;
-}
-ul.secondary a {
- padding: 0;
- text-decoration: none;
-}
-ul.secondary a.active {
- border-bottom: 4px solid #999;
-}
-
-/*
-** Help module
-*/
-.help-items {
- float: left;
- width: 22%;
- padding-right: 3%;
-}
-.help-items-last {
- padding-right: 0;
-}
-
-/*
-** Autocomplete styles
-*/
-/* Suggestion list */
-#autocomplete {
- position: absolute;
- border: 1px solid;
- overflow: hidden;
-}
-#autocomplete ul {
- margin: 0;
- padding: 0;
- list-style: none;
-}
-#autocomplete li {
- background: #fff;
- color: #000;
- white-space: pre;
- cursor: default;
-}
-#autocomplete li.selected {
- background: #0072b9;
- color: #fff;
-}
-/* Animated throbber */
-html.js input.form-autocomplete {
- background-image: url(throbber.gif);
- background-repeat: no-repeat;
- background-position: 100% 2px;
-}
-html.js input.throbbing {
- background-position: 100% -18px;
-}
-
-/*
-** Progressbar styles
-*/
-.progress {
- font-weight: bold;
-}
-.progress .bar {
- background: #fff url(progress.gif);
- border: 1px solid #00375a;
- height: 1.5em;
- margin-top: 0.2em;
-}
-.progress .filled {
- background: #0072b9;
- height: 1em;
- border-bottom: 0.5em solid #004a73;
- width: 0%;
-}
-.progress .percentage {
- float: right;
-}
-
-/*
-** Collapsing fieldsets
-*/
-html.js fieldset.collapsed {
- border-bottom-width: 0;
- border-left-width: 0;
- border-right-width: 0;
- margin-bottom: 0;
-}
-html.js fieldset.collapsed * {
- display: none;
-}
-html.js fieldset.collapsed table *,
-html.js fieldset.collapsed legend,
-html.js fieldset.collapsed legend * {
- display: inline;
-}
-html.js fieldset.collapsible legend a {
- padding-left: 15px;
- background: url(menu-expanded.png) 5px 50% no-repeat;
-}
-html.js fieldset.collapsed legend a {
- background-image: url(menu-collapsed.png);
-}
-/* Note: IE-only fix due to '* html' (breaks Konqueror otherwise). */
-* html.js fieldset.collapsible legend a {
- display: block;
-}
-
-/*
-** Resizable text areas
-*/
-.resizable-textarea {
- width: 95%;
-}
-.resizable-textarea .grippie {
- height: 14px;
- background: #eee url(grippie.png) no-repeat 100% 100%;
- border: 1px solid #ddd;
- border-top-width: 0;
- cursor: s-resize;
-}
-
-/*
-** Formatting for welcome page
-*/
-#first-time strong {
- display: block;
- padding: 1.5em 0 .5em;
-}
+++ /dev/null
-// $Id: drupal.js 144 2007-03-28 07:52:20Z thierry $
-
-/**
- * Only enable Javascript functionality if all required features are supported.
- */
-function isJsEnabled() {
- if (typeof document.jsEnabled == 'undefined') {
- // Note: ! casts to boolean implicitly.
- document.jsEnabled = !(
- !document.getElementsByTagName ||
- !document.createElement ||
- !document.createTextNode ||
- !document.documentElement ||
- !document.getElementById);
- }
- return document.jsEnabled;
-}
-
-// Global Killswitch on the <html> element
-if (isJsEnabled()) {
- document.documentElement.className = 'js';
-}
-
-/**
- * Make IE's XMLHTTP object accessible through XMLHttpRequest()
- */
-if (typeof XMLHttpRequest == 'undefined') {
- XMLHttpRequest = function () {
- var msxmls = ['MSXML3', 'MSXML2', 'Microsoft']
- for (var i=0; i < msxmls.length; i++) {
- try {
- return new ActiveXObject(msxmls[i]+'.XMLHTTP')
- }
- catch (e) { }
- }
- throw new Error("No XML component installed!");
- }
-}
-
-/**
- * Creates an HTTP GET request and sends the response to the callback function.
- *
- * Note that dynamic arguments in the URI should be escaped with encodeURIComponent().
- */
-function HTTPGet(uri, callbackFunction, callbackParameter) {
- var xmlHttp = new XMLHttpRequest();
- var bAsync = true;
- if (!callbackFunction) {
- bAsync = false;
- }
- xmlHttp.open('GET', uri, bAsync);
- xmlHttp.send(null);
-
- if (bAsync) {
- if (callbackFunction) {
- xmlHttp.onreadystatechange = function() {
- if (xmlHttp.readyState == 4) {
- callbackFunction(xmlHttp.responseText, xmlHttp, callbackParameter);
- }
- }
- }
- return xmlHttp;
- }
- else {
- return xmlHttp.responseText;
- }
-}
-
-/**
- * Creates an HTTP POST request and sends the response to the callback function
- *
- * Note: passing null or undefined for 'object' makes the request fail in Opera 8.
- * Pass an empty string instead.
- */
-function HTTPPost(uri, callbackFunction, callbackParameter, object) {
- var xmlHttp = new XMLHttpRequest();
- var bAsync = true;
- if (!callbackFunction) {
- bAsync = false;
- }
- xmlHttp.open('POST', uri, bAsync);
-
- var toSend = '';
- if (typeof object == 'object') {
- xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
- for (var i in object) {
- toSend += (toSend ? '&' : '') + i + '=' + encodeURIComponent(object[i]);
- }
- }
- else {
- toSend = object;
- }
- xmlHttp.send(toSend);
-
- if (bAsync) {
- if (callbackFunction) {
- xmlHttp.onreadystatechange = function() {
- if (xmlHttp.readyState == 4) {
- callbackFunction(xmlHttp.responseText, xmlHttp, callbackParameter);
- }
- }
- }
- return xmlHttp;
- }
- else {
- return xmlHttp.responseText;
- }
-}
-
-/**
- * Redirects a button's form submission to a hidden iframe and displays the result
- * in a given wrapper. The iframe should contain a call to
- * window.parent.iframeHandler() after submission.
- */
-function redirectFormButton(uri, button, handler) {
- // (Re)create an iframe to target.
- createIframe();
-
- // Trap the button
- button.onmouseover = button.onfocus = function() {
- button.onclick = function() {
- // Prepare variables for use in anonymous function.
- var button = this;
- var action = button.form.action;
- var target = button.form.target;
-
- // Redirect form submission
- this.form.action = uri;
- this.form.target = 'redirect-target';
-
- handler.onsubmit();
-
- // Set iframe handler for later
- window.iframeHandler = function () {
- var iframe = $('redirect-target');
- // Restore form submission
- button.form.action = action;
- button.form.target = target;
-
- // Get response from iframe body
- try {
- response = (iframe.contentWindow || iframe.contentDocument || iframe).document.body.innerHTML;
- // Firefox 1.0.x hack: Remove (corrupted) control characters
- response = response.replace(/[\f\n\r\t]/g, ' ');
- if (window.opera) {
- // Opera-hack: it returns innerHTML sanitized.
- response = response.replace(/"/g, '"');
- }
- }
- catch (e) {
- response = null;
- }
-
- $('redirect-target').onload = null;
- $('redirect-target').src = 'about:blank';
-
- response = parseJson(response);
- // Check response code
- if (response.status == 0) {
- handler.onerror(response.data);
- return;
- }
- handler.oncomplete(response.data);
- }
-
- return true;
- }
- }
- button.onmouseout = button.onblur = function() {
- button.onclick = null;
- }
-}
-
-/**
- * Adds a function to the window onload event
- */
-function addLoadEvent(func) {
- var oldOnload = window.onload;
- if (typeof window.onload != 'function') {
- window.onload = func;
- }
- else {
- window.onload = function() {
- oldOnload();
- func();
- }
- }
-}
-
-/**
- * Adds a function to a given form's submit event
- */
-function addSubmitEvent(form, func) {
- var oldSubmit = form.onsubmit;
- if (typeof oldSubmit != 'function') {
- form.onsubmit = func;
- }
- else {
- form.onsubmit = function() {
- return oldSubmit() && func();
- }
- }
-}
-
-/**
- * Retrieves the absolute position of an element on the screen
- */
-function absolutePosition(el) {
- var sLeft = 0, sTop = 0;
- var isDiv = /^div$/i.test(el.tagName);
- if (isDiv && el.scrollLeft) {
- sLeft = el.scrollLeft;
- }
- if (isDiv && el.scrollTop) {
- sTop = el.scrollTop;
- }
- var r = { x: el.offsetLeft - sLeft, y: el.offsetTop - sTop };
- if (el.offsetParent) {
- var tmp = absolutePosition(el.offsetParent);
- r.x += tmp.x;
- r.y += tmp.y;
- }
- return r;
-};
-
-function dimensions(el) {
- return { width: el.offsetWidth, height: el.offsetHeight };
-}
-
-/**
- * Returns true if an element has a specified class name
- */
-function hasClass(node, className) {
- if (node.className == className) {
- return true;
- }
- var reg = new RegExp('(^| )'+ className +'($| )')
- if (reg.test(node.className)) {
- return true;
- }
- return false;
-}
-
-/**
- * Adds a class name to an element
- */
-function addClass(node, className) {
- if (hasClass(node, className)) {
- return false;
- }
- node.className += ' '+ className;
- return true;
-}
-
-/**
- * Removes a class name from an element
- */
-function removeClass(node, className) {
- if (!hasClass(node, className)) {
- return false;
- }
- // Replaces words surrounded with whitespace or at a string border with a space. Prevents multiple class names from being glued together.
- node.className = eregReplace('(^|\\s+)'+ className +'($|\\s+)', ' ', node.className);
- return true;
-}
-
-/**
- * Toggles a class name on or off for an element
- */
-function toggleClass(node, className) {
- if (!removeClass(node, className) && !addClass(node, className)) {
- return false;
- }
- return true;
-}
-
-/**
- * Emulate PHP's ereg_replace function in javascript
- */
-function eregReplace(search, replace, subject) {
- return subject.replace(new RegExp(search,'g'), replace);
-}
-
-/**
- * Removes an element from the page
- */
-function removeNode(node) {
- if (typeof node == 'string') {
- node = $(node);
- }
- if (node && node.parentNode) {
- return node.parentNode.removeChild(node);
- }
- else {
- return false;
- }
-}
-
-/**
- * Prevents an event from propagating.
- */
-function stopEvent(event) {
- if (event.preventDefault) {
- event.preventDefault();
- event.stopPropagation();
- }
- else {
- event.returnValue = false;
- event.cancelBubble = true;
- }
-}
-
-/**
- * Parse a JSON response.
- *
- * The result is either the JSON object, or an object with 'status' 0 and 'data' an error message.
- */
-function parseJson(data) {
- if (data.substring(0,1) != '{') {
- return { status: 0, data: data.length ? data : 'Unspecified error' };
- }
- return eval('(' + data + ');');
-}
-
-/**
- * Create an invisible iframe for form submissions.
- */
-function createIframe() {
- // Delete any previous iframe
- deleteIframe();
- // Note: some browsers require the literal name/id attributes on the tag,
- // some want them set through JS. We do both.
- window.iframeHandler = function () {};
- var div = document.createElement('div');
- div.id = 'redirect-holder';
- div.innerHTML = '<iframe name="redirect-target" id="redirect-target" class="redirect" onload="window.iframeHandler();"></iframe>';
- var iframe = div.firstChild;
- with (iframe) {
- name = 'redirect-target';
- setAttribute('name', 'redirect-target');
- id = 'redirect-target';
- }
- with (iframe.style) {
- position = 'absolute';
- height = '1px';
- width = '1px';
- visibility = 'hidden';
- }
- document.body.appendChild(div);
-}
-
-/**
- * Delete the invisible iframe for form submissions.
- */
-function deleteIframe() {
- var holder = $('redirect-holder');
- if (holder != null) {
- removeNode(holder);
- }
-}
-
-/**
- * Wrapper around document.getElementById().
- */
-function $(id) {
- return document.getElementById(id);
-}
+++ /dev/null
-/* $Id: maintenance.css 144 2007-03-28 07:52:20Z thierry $ */
-
-body {
- background: url(druplicon.png) 4.2em 4em no-repeat #fff;
- color: #000;
- border: 1px solid #bbb;
- margin: 3em;
- padding: 1em 1em 1em 128px;
-}
-h1 {
- margin: 1.6em 0 1.1em 0;
-}
-h1, h2, h3, h4, h5, h6 {
- font-family: sans-serif;
-}
-:link {
- color: #0073ba;
- font-weight: bold;
-}
-:visited {
- color: #004975;
- font-weight: bold;
-}
-
-div.messages {
- border: 1px solid #ddd;
- padding: 0.4em;
- margin-top: 1em;
-}
-
-div.error {
- border: 1px solid #daa;
-}
-
-/* Update styles */
-#update-results {
- margin-top: 3em;
- padding: 0.25em;
- border: 1px solid #ccc;
- background: #eee;
- font-size: smaller;
-}
-#update-results h2 {
- margin-top: 0.25em;
-}
-#update-results h4 {
- margin-bottom: 0.25em;
-}
-#update-results li.none {
- color: #888;
- font-style: italic;
-}
-#update-results li.failure strong {
- color: #b63300;
-}
+++ /dev/null
-/* $Id: print.css 144 2007-03-28 07:52:20Z thierry $ */
-
-body {
- margin: 1em;
- background-color: #fff;
-}
-th {
- text-align: left;
- color: #006;
- border-bottom: 1px solid #ccc;
-}
-tr.odd {
- background-color: #ddd;
-}
-tr.even {
- background-color: #fff;
-}
-td {
- padding: 5px;
-}
-#menu {
- visibility: hidden;
-}
-#main {
- margin: 1em;
-}
+++ /dev/null
-// $Id: progress.js 144 2007-03-28 07:52:20Z thierry $
-
-/**
- * A progressbar object. Initialized with the given id. Must be inserted into
- * the DOM afterwards through progressBar.element.
- *
- * method is the function which will perform the HTTP request to get the
- * progress bar state. Either HTTPGet or HTTPPost.
- *
- * e.g. pb = new progressBar('myProgressBar');
- * some_element.appendChild(pb.element);
- */
-function progressBar(id, updateCallback, method, errorCallback) {
- var pb = this;
- this.id = id;
- this.method = method ? method : HTTPGet;
- this.updateCallback = updateCallback;
- this.errorCallback = errorCallback;
-
- this.element = document.createElement('div');
- this.element.id = id;
- this.element.className = 'progress';
- this.element.innerHTML = '<div class="percentage"></div>'+
- '<div class="message"> </div>'+
- '<div class="bar"><div class="filled"></div></div>';
-}
-
-/**
- * Set the percentage and status message for the progressbar.
- */
-progressBar.prototype.setProgress = function (percentage, message) {
- var divs = this.element.getElementsByTagName('div');
- var div;
- for (var i = 0; div = divs[i]; ++i) {
- if (percentage >= 0) {
- if (hasClass(divs[i], 'filled')) {
- divs[i].style.width = percentage + '%';
- }
- if (hasClass(divs[i], 'percentage')) {
- divs[i].innerHTML = percentage + '%';
- }
- }
- if (hasClass(divs[i], 'message')) {
- divs[i].innerHTML = message;
- }
- }
- if (this.updateCallback) {
- this.updateCallback(percentage, message, this);
- }
-}
-
-/**
- * Start monitoring progress via Ajax.
- */
-progressBar.prototype.startMonitoring = function (uri, delay) {
- this.delay = delay;
- this.uri = uri;
- this.sendPing();
-}
-
-/**
- * Stop monitoring progress via Ajax.
- */
-progressBar.prototype.stopMonitoring = function () {
- clearTimeout(this.timer);
- // This allows monitoring to be stopped from within the callback
- this.uri = null;
-}
-
-/**
- * Request progress data from server.
- */
-progressBar.prototype.sendPing = function () {
- if (this.timer) {
- clearTimeout(this.timer);
- }
- if (this.uri) {
- this.method(this.uri, this.receivePing, this, '');
- }
-}
-
-/**
- * HTTP callback function. Passes data back to the progressbar and sets a new
- * timer for the next ping.
- */
-progressBar.prototype.receivePing = function (string, xmlhttp, pb) {
- if (xmlhttp.status != 200) {
- return pb.displayError('An HTTP error '+ xmlhttp.status +' occured.\n'+ pb.uri);
- }
- // Parse response
- var progress = parseJson(string);
- // Display errors
- if (progress.status == 0) {
- pb.displayError(progress.data);
- return;
- }
-
- // Update display
- pb.setProgress(progress.percentage, progress.message);
- // Schedule next timer
- pb.timer = setTimeout(function() { pb.sendPing(); }, pb.delay);
-}
-
-/**
- * Display errors on the page.
- */
-progressBar.prototype.displayError = function (string) {
- var error = document.createElement('div');
- error.className = 'error';
- error.innerHTML = string;
-
- this.element.style.display = 'none';
- this.element.parentNode.insertBefore(error, this.element);
-
- if (this.errorCallback) {
- this.errorCallback(this);
- }
-}
+++ /dev/null
-// $Id: textarea.js 144 2007-03-28 07:52:20Z thierry $
-
-if (isJsEnabled()) {
- addLoadEvent(textAreaAutoAttach);
-}
-
-function textAreaAutoAttach(event, parent) {
- if (typeof parent == 'undefined') {
- // Attach to all visible textareas.
- textareas = document.getElementsByTagName('textarea');
- }
- else {
- // Attach to all visible textareas inside parent.
- textareas = parent.getElementsByTagName('textarea');
- }
- var textarea;
- for (var i = 0; textarea = textareas[i]; ++i) {
- if (hasClass(textarea, 'resizable') && !hasClass(textarea.nextSibling, 'grippie')) {
- if (typeof dimensions(textarea).width != 'undefined' && dimensions(textarea).width != 0) {
- new textArea(textarea);
- }
- }
- }
-}
-
-function textArea(element) {
- var ta = this;
- this.element = element;
- this.parent = this.element.parentNode;
- this.dimensions = dimensions(element);
-
- // Prepare wrapper
- this.wrapper = document.createElement('div');
- this.wrapper.className = 'resizable-textarea';
- this.parent.insertBefore(this.wrapper, this.element);
-
- // Add grippie and measure it
- this.grippie = document.createElement('div');
- this.grippie.className = 'grippie';
- this.wrapper.appendChild(this.grippie);
- this.grippie.dimensions = dimensions(this.grippie);
- this.grippie.onmousedown = function (e) { ta.beginDrag(e); };
-
- // Set wrapper and textarea dimensions
- this.wrapper.style.height = this.dimensions.height + this.grippie.dimensions.height + 1 +'px';
- this.element.style.marginBottom = '0px';
- this.element.style.width = '100%';
- this.element.style.height = this.dimensions.height +'px';
-
- // Wrap textarea
- removeNode(this.element);
- this.wrapper.insertBefore(this.element, this.grippie);
-
- // Measure difference between desired and actual textarea dimensions to account for padding/borders
- this.widthOffset = dimensions(this.wrapper).width - this.dimensions.width;
-
- // Make the grippie line up in various browsers
- if (window.opera) {
- // Opera
- this.grippie.style.marginRight = '4px';
- }
- if (document.all && !window.opera) {
- // IE
- this.grippie.style.width = '100%';
- this.grippie.style.paddingLeft = '2px';
- }
- // Mozilla
- this.element.style.MozBoxSizing = 'border-box';
-
- this.heightOffset = absolutePosition(this.grippie).y - absolutePosition(this.element).y - this.dimensions.height;
-}
-
-textArea.prototype.beginDrag = function (event) {
- if (document.isDragging) {
- return;
- }
- document.isDragging = true;
-
- event = event || window.event;
- // Capture mouse
- var cp = this;
- this.oldMoveHandler = document.onmousemove;
- document.onmousemove = function(e) { cp.handleDrag(e); };
- this.oldUpHandler = document.onmouseup;
- document.onmouseup = function(e) { cp.endDrag(e); };
-
- // Store drag offset from grippie top
- var pos = absolutePosition(this.grippie);
- this.dragOffset = event.clientY - pos.y;
-
- // Make transparent
- this.element.style.opacity = 0.5;
-
- // Process
- this.handleDrag(event);
-}
-
-textArea.prototype.handleDrag = function (event) {
- event = event || window.event;
- // Get coordinates relative to text area
- var pos = absolutePosition(this.element);
- var y = event.clientY - pos.y;
-
- // Set new height
- var height = Math.max(32, y - this.dragOffset - this.heightOffset);
- this.wrapper.style.height = height + this.grippie.dimensions.height + 1 + 'px';
- this.element.style.height = height + 'px';
-
- // Avoid text selection
- stopEvent(event);
-}
-
-textArea.prototype.endDrag = function (event) {
- // Uncapture mouse
- document.onmousemove = this.oldMoveHandler;
- document.onmouseup = this.oldUpHandler;
-
- // Restore opacity
- this.element.style.opacity = 1.0;
- document.isDragging = false;
-}
-
+++ /dev/null
-// $Id: update.js 144 2007-03-28 07:52:20Z thierry $
-
-if (isJsEnabled()) {
- addLoadEvent(function() {
- if ($('edit-has_js')) {
- $('edit-has_js').value = 1;
- }
-
- if ($('progress')) {
- // Success: redirect to the summary.
- var updateCallback = function (progress, status, pb) {
- if (progress == 100) {
- pb.stopMonitoring();
- window.location = window.location.href.split('op=')[0] +'op=finished';
- }
- }
-
- // Failure: point out error message and provide link to the summary.
- var errorCallback = function (pb) {
- var div = document.createElement('p');
- div.className = 'error';
- div.innerHTML = 'An unrecoverable error has occured. You can find the error message below. It is advised to copy it to the clipboard for reference. Please continue to the <a href="update.php?op=error">update summary</a>';
- $('progress').insertBefore(div, $('progress').firstChild);
- $('wait').style.display = 'none';
- }
-
- var progress = new progressBar('updateprogress', updateCallback, HTTPPost, errorCallback);
- progress.setProgress(-1, 'Starting updates');
- $('progress').appendChild(progress.element);
- progress.startMonitoring('update.php?op=do_update', 0);
- }
- });
-}
+++ /dev/null
-// $Id: upload.js 144 2007-03-28 07:52:20Z thierry $
-
-// Global killswitch
-if (isJsEnabled()) {
- addLoadEvent(uploadAutoAttach);
-}
-
-/**
- * Attaches the upload behaviour to the upload form.
- */
-function uploadAutoAttach() {
- var inputs = document.getElementsByTagName('input');
- for (i = 0; input = inputs[i]; i++) {
- if (input && hasClass(input, 'upload')) {
- var uri = input.value;
- // Extract the button ID based on a substring of the input name: edit[foo][bar] -> foo-bar
- var button = input.name.substr(5, input.name.length - 6).replace('][', '-');
- var wrapper = button + '-wrapper';
- var hide = button + '-hide';
- var upload = new jsUpload(uri, button, wrapper, hide);
- }
- }
-}
-
-/**
- * JS upload object.
- */
-function jsUpload(uri, button, wrapper, hide) {
- this.button = button;
- this.wrapper = wrapper;
- this.hide = hide;
- redirectFormButton(uri, $(button), this);
-}
-
-/**
- * Handler for the form redirection submission.
- */
-jsUpload.prototype.onsubmit = function () {
- var hide = $(this.hide);
- // Insert progressbar and stretch to take the same space.
- this.progress = new progressBar('uploadprogress');
- this.progress.setProgress(-1, 'Uploading file');
- this.progress.element.style.width = '28em';
- this.progress.element.style.height = hide.offsetHeight +'px';
- hide.parentNode.insertBefore(this.progress.element, hide);
- // Hide file form (cannot use display: none, this mysteriously aborts form
- // submission in Konqueror)
- hide.style.position = 'absolute';
- hide.style.left = '-2000px';
-}
-
-/**
- * Handler for the form redirection completion.
- */
-jsUpload.prototype.oncomplete = function (data) {
- // Remove progressbar
- removeNode(this.progress.element);
- this.progress = null;
- // Replace form and re-attach behaviour
- $(this.wrapper).innerHTML = data;
- uploadAutoAttach();
-}
-
-/**
- * Handler for the form redirection error.
- */
-jsUpload.prototype.onerror = function (error) {
- alert('An error occurred:\n\n'+ error);
- // Remove progressbar
- removeNode(this.progress.element);
- this.progress = null;
- // Undo hide
- $(this.hide).style.position = 'static';
- $(this.hide).style.left = '0px';
-}