From 3d5ccfa22964db52297d413c8e390b61d974cd48 Mon Sep 17 00:00:00 2001 From: Sasha Sherstnev Date: Thu, 7 Nov 2013 12:51:19 +0000 Subject: [PATCH] Add tomcat ROOT apps for VMs --- VMrootpage/2.0/ROOT/css/base.css | 64 + VMrootpage/2.0/ROOT/css/ui.tabs.css | 113 + VMrootpage/2.0/ROOT/images/filemanager.png | Bin 0 -> 7976 bytes VMrootpage/2.0/ROOT/images/phpmyadmin.png | Bin 0 -> 8499 bytes VMrootpage/2.0/ROOT/images/phppgadmin.png | Bin 0 -> 8473 bytes VMrootpage/2.0/ROOT/images/shell.png | Bin 0 -> 7104 bytes VMrootpage/2.0/ROOT/images/tab.png | Bin 0 -> 734 bytes VMrootpage/2.0/ROOT/images/tomcat.png | Bin 0 -> 8609 bytes VMrootpage/2.0/ROOT/images/webmin.png | Bin 0 -> 9970 bytes VMrootpage/2.0/ROOT/index.jsp | 71 + VMrootpage/2.0/ROOT/js/jquery-1.2.6.js | 3549 ++++++++++++++++++++++++++ VMrootpage/2.0/ROOT/js/ui.core.js | 495 ++++ VMrootpage/2.0/ROOT/js/ui.tabs.js | 560 ++++ VMrootpage/2.0/ROOT/tomcat.gif | Bin 0 -> 1441 bytes VMrootpage/2.1.0/ROOT/css/base.css | 64 + VMrootpage/2.1.0/ROOT/css/ui.tabs.css | 113 + VMrootpage/2.1.0/ROOT/images/filemanager.png | Bin 0 -> 7976 bytes VMrootpage/2.1.0/ROOT/images/phpmyadmin.png | Bin 0 -> 8499 bytes VMrootpage/2.1.0/ROOT/images/phppgadmin.png | Bin 0 -> 8473 bytes VMrootpage/2.1.0/ROOT/images/shell.png | Bin 0 -> 7104 bytes VMrootpage/2.1.0/ROOT/images/tab.png | Bin 0 -> 734 bytes VMrootpage/2.1.0/ROOT/images/tomcat.png | Bin 0 -> 8609 bytes VMrootpage/2.1.0/ROOT/images/webmin.png | Bin 0 -> 9970 bytes VMrootpage/2.1.0/ROOT/index.jsp | 74 + VMrootpage/2.1.0/ROOT/js/jquery-1.2.6.js | 3549 ++++++++++++++++++++++++++ VMrootpage/2.1.0/ROOT/js/ui.core.js | 495 ++++ VMrootpage/2.1.0/ROOT/js/ui.tabs.js | 560 ++++ VMrootpage/2.1.0/ROOT/tomcat.gif | Bin 0 -> 1441 bytes 28 files changed, 9707 insertions(+) create mode 100644 VMrootpage/2.0/ROOT/css/base.css create mode 100644 VMrootpage/2.0/ROOT/css/ui.tabs.css create mode 100644 VMrootpage/2.0/ROOT/images/filemanager.png create mode 100644 VMrootpage/2.0/ROOT/images/phpmyadmin.png create mode 100644 VMrootpage/2.0/ROOT/images/phppgadmin.png create mode 100644 VMrootpage/2.0/ROOT/images/shell.png create mode 100644 VMrootpage/2.0/ROOT/images/tab.png create mode 100644 VMrootpage/2.0/ROOT/images/tomcat.png create mode 100644 VMrootpage/2.0/ROOT/images/webmin.png create mode 100644 VMrootpage/2.0/ROOT/index.jsp create mode 100644 VMrootpage/2.0/ROOT/js/jquery-1.2.6.js create mode 100644 VMrootpage/2.0/ROOT/js/ui.core.js create mode 100644 VMrootpage/2.0/ROOT/js/ui.tabs.js create mode 100644 VMrootpage/2.0/ROOT/tomcat.gif create mode 100644 VMrootpage/2.1.0/ROOT/css/base.css create mode 100644 VMrootpage/2.1.0/ROOT/css/ui.tabs.css create mode 100644 VMrootpage/2.1.0/ROOT/images/filemanager.png create mode 100644 VMrootpage/2.1.0/ROOT/images/phpmyadmin.png create mode 100644 VMrootpage/2.1.0/ROOT/images/phppgadmin.png create mode 100644 VMrootpage/2.1.0/ROOT/images/shell.png create mode 100644 VMrootpage/2.1.0/ROOT/images/tab.png create mode 100644 VMrootpage/2.1.0/ROOT/images/tomcat.png create mode 100644 VMrootpage/2.1.0/ROOT/images/webmin.png create mode 100644 VMrootpage/2.1.0/ROOT/index.jsp create mode 100644 VMrootpage/2.1.0/ROOT/js/jquery-1.2.6.js create mode 100644 VMrootpage/2.1.0/ROOT/js/ui.core.js create mode 100644 VMrootpage/2.1.0/ROOT/js/ui.tabs.js create mode 100644 VMrootpage/2.1.0/ROOT/tomcat.gif diff --git a/VMrootpage/2.0/ROOT/css/base.css b/VMrootpage/2.0/ROOT/css/base.css new file mode 100644 index 0000000..ede35b4 --- /dev/null +++ b/VMrootpage/2.0/ROOT/css/base.css @@ -0,0 +1,64 @@ +body, h1, h2 { + font-family: "Trebuchet MS", Trebuchet, Verdana, Helvetica, Arial, sans-serif; +} +h1 { + margin: 1em 0 1.5em; + font-size: 18px; + text-align: center; +} +h2 { + font-size: 16px; + text-align: center; +} +p { + margin: 0; + padding: 0 0 .5em; + max-width: 45em; +} +#container-1 { + width: 520px; + margin-left: auto; + margin-right: auto; +} +.fragment-content > div { + color: #444444; + float: left; + height: 120px; + padding: 5pt 8px; + text-align: center; + width: 84px; +} +.fragment-content a { + color: #003399; + text-decoration: none; +} +.fragment-content a:hover { + color: #0066FF; + text-decoration: underline; +} +.fragment-content img { + display: block; + margin: 0pt auto; + border: 0pt none; + border-style: none; +} +.fragment-content .icon { + float: left; + width: 64px; + height: 80px; + padding: 0pt 8px; +} +pre { + margin-top: 1em; + margin-bottom: 1em; + background-color: #eee; + padding: 0.75em 1.5em; + font-size: 12px; + border: 1px solid #ddd; + border-right: #aaa 1px solid; + border-bottom: #aaa 1px solid; + overflow: auto; +} +#turnkey-credit { + display: none; +} diff --git a/VMrootpage/2.0/ROOT/css/ui.tabs.css b/VMrootpage/2.0/ROOT/css/ui.tabs.css new file mode 100644 index 0000000..3154221 --- /dev/null +++ b/VMrootpage/2.0/ROOT/css/ui.tabs.css @@ -0,0 +1,113 @@ +/* Caution! Ensure accessibility in print and other media types... */ +@media projection, screen { /* Use class for showing/hiding tab content, so that visibility can be better controlled in different media types... */ + .ui-tabs-hide { + display: none; + } +} + +/* Hide useless elements in print layouts... */ +@media print { + .ui-tabs-nav { + display: none; + } +} + +/* Skin */ +.ui-tabs-nav, .ui-tabs-panel { + font-family: "Trebuchet MS", Trebuchet, Verdana, Helvetica, Arial, sans-serif; + font-size: 12px; +} +.ui-tabs-nav { + list-style: none; + margin: 0; + padding: 0 0 0 4px; +} +.ui-tabs-nav:after { /* clearing without presentational markup, IE gets extra treatment */ + display: block; + clear: both; + content: " "; +} +.ui-tabs-nav li { + float: left; + margin: 0 0 0 1px; + min-width: 84px; /* be nice to Opera */ +} +.ui-tabs-nav a, .ui-tabs-nav a span { + display: block; + padding: 0 10px; + background: url(../images/tab.png) no-repeat; +} +.ui-tabs-nav a { + margin: 1px 0 0; /* position: relative makes opacity fail for disabled tab in IE */ + padding-left: 0; + color: #27537a; + font-weight: bold; + line-height: 1.2; + text-align: center; + text-decoration: none; + white-space: nowrap; /* required in IE 6 */ + outline: 0; /* prevent dotted border in Firefox */ +} +.ui-tabs-nav .ui-tabs-selected a { + position: relative; + top: 1px; + z-index: 2; + margin-top: 0; + color: #000; +} +.ui-tabs-nav a span { + width: 64px; /* IE 6 treats width as min-width */ + min-width: 64px; + height: 18px; /* IE 6 treats height as min-height */ + min-height: 18px; + padding-top: 6px; + padding-right: 0; +} +*>.ui-tabs-nav a span { /* hide from IE 6 */ + width: auto; + height: auto; +} +.ui-tabs-nav .ui-tabs-selected a span { + padding-bottom: 1px; +} +.ui-tabs-nav .ui-tabs-selected a, .ui-tabs-nav a:hover, .ui-tabs-nav a:focus, .ui-tabs-nav a:active { + background-position: 100% -150px; +} +.ui-tabs-nav a, .ui-tabs-nav .ui-tabs-disabled a:hover, .ui-tabs-nav .ui-tabs-disabled a:focus, .ui-tabs-nav .ui-tabs-disabled a:active { + background-position: 100% -100px; +} +.ui-tabs-nav .ui-tabs-selected a span, .ui-tabs-nav a:hover span, .ui-tabs-nav a:focus span, .ui-tabs-nav a:active span { + background-position: 0 -50px; +} +.ui-tabs-nav a span, .ui-tabs-nav .ui-tabs-disabled a:hover span, .ui-tabs-nav .ui-tabs-disabled a:focus span, .ui-tabs-nav .ui-tabs-disabled a:active span { + background-position: 0 0; +} +.ui-tabs-nav .ui-tabs-selected a:link, .ui-tabs-nav .ui-tabs-selected a:visited, .ui-tabs-nav .ui-tabs-disabled a:link, .ui-tabs-nav .ui-tabs-disabled a:visited { /* @ Opera, use pseudo classes otherwise it confuses cursor... */ + cursor: text; +} +.ui-tabs-nav a:hover, .ui-tabs-nav a:focus, .ui-tabs-nav a:active, +.ui-tabs-nav .ui-tabs-deselectable a:hover, .ui-tabs-nav .ui-tabs-deselectable a:focus, .ui-tabs-nav .ui-tabs-deselectable a:active { /* @ Opera, we need to be explicit again here now... */ + cursor: pointer; +} +.ui-tabs-disabled { + opacity: .4; + filter: alpha(opacity=40); +} +.ui-tabs-panel { + border-top: 1px solid #97a5b0; + padding: 1em 8px; + background: #fff; /* declare background color for container to avoid distorted fonts in IE while fading */ +} +.ui-tabs-loading em { + padding: 0 0 0 20px; + background: url(loading.gif) no-repeat 0 50%; +} + +/* Additional IE specific bug fixes... */ +* html .ui-tabs-nav { /* auto clear, @ IE 6 & IE 7 Quirks Mode */ + display: inline-block; +} +*:first-child+html .ui-tabs-nav { /* @ IE 7 Standards Mode - do not group selectors, otherwise IE 6 will ignore complete rule (because of the unknown + combinator)... */ + display: inline-block; +} + diff --git a/VMrootpage/2.0/ROOT/images/filemanager.png b/VMrootpage/2.0/ROOT/images/filemanager.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a88683de9b83cb33b68c51418cb730b80909cc GIT binary patch literal 7976 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 literal 0 HcmV?d00001 diff --git a/VMrootpage/2.0/ROOT/images/webmin.png b/VMrootpage/2.0/ROOT/images/webmin.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe5d5d81966302915032e7779252b9706e4ace2 GIT binary patch literal 9970 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%0DSu= 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 + + + + + + + + JABAWS Tomcat + + + + + + + + + + + +

JABAWS Tomcat

+

JABAWS URL for Jalview is + http://<%= request.getServerName() %>/jabaws

+
+ + +
+
+
+ Web Apps +
+ + +
+
+
+

Resources and references

+
    +
  • System credentials: + username: root + password: jabaws +
  • + +
  • Tomcat default credentials: + username: admin, + password: empty/no password +
  • + +
  • + Apache Tomcat Documentation
  • +
+ +
+
+ +
+ + diff --git a/VMrootpage/2.0/ROOT/js/jquery-1.2.6.js b/VMrootpage/2.0/ROOT/js/jquery-1.2.6.js new file mode 100644 index 0000000..88e661e --- /dev/null +++ b/VMrootpage/2.0/ROOT/js/jquery-1.2.6.js @@ -0,0 +1,3549 @@ +(function(){ +/* + * jQuery 1.2.6 - New Wave Javascript + * + * Copyright (c) 2008 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $ + * $Rev: 5685 $ + */ + +// Map over jQuery in case of overwrite +var _jQuery = window.jQuery, +// Map over the $ in case of overwrite + _$ = window.$; + +var jQuery = window.jQuery = window.$ = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context ); +}; + +// A simple way to check for HTML strings or ID strings +// (both of which we optimize for) +var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/, + +// Is it a simple selector + isSimple = /^.[^:#\[\.]*$/, + +// Will speed up references to undefined, and allows munging its name. + undefined; + +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; + 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 + return jQuery( elem ); + } + 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 )[ jQuery.fn.ready ? "ready" : "load" ]( selector ); + + return this.setArray(jQuery.makeArray(selector)); + }, + + // The current version of jQuery being used + jquery: "1.2.6", + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + // The number of elements contained in the matched element set + length: 0, + + // 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 ) { + // Build a new jQuery matched element set + var ret = jQuery( elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // 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 ) { + var ret = -1; + + // 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 ( name.constructor == 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 + jQuery( html, this[0].ownerDocument ) + .clone() + .insertBefore( this[0] ) + .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, false, function(elem){ + if (this.nodeType == 1) + this.appendChild( elem ); + }); + }, + + prepend: function() { + return this.domManip(arguments, true, true, function(elem){ + if (this.nodeType == 1) + this.insertBefore( elem, this.firstChild ); + }); + }, + + before: function() { + return this.domManip(arguments, false, false, function(elem){ + this.parentNode.insertBefore( elem, this ); + }); + }, + + after: function() { + return this.domManip(arguments, false, true, function(elem){ + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + }, + + end: function() { + return this.prevObject || jQuery( [] ); + }, + + find: function( selector ) { + var elems = jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + }); + + return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ? + jQuery.unique( elems ) : + elems ); + }, + + clone: function( events ) { + // Do the clone + var ret = this.map(function(){ + if ( jQuery.browser.msie && !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, this ) ); + }, + + not: function( selector ) { + if ( selector.constructor == String ) + // test special case where just one selector is passed in + if ( isSimple.test( selector ) ) + return this.pushStack( jQuery.multiFilter( selector, this, true ) ); + 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 this.is( "." + selector ); + }, + + val: function( value ) { + if ( value == undefined ) { + + if ( this.length ) { + var elem = this[0]; + + // 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.browser.msie && !option.attributes.value.specified ? option.text : option.value; + + // 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 + } else + return (this[0].value || "").replace(/\r/g, ""); + + } + + return undefined; + } + + if( value.constructor == Number ) + value += ''; + + return this.each(function(){ + if ( this.nodeType != 1 ) + return; + + if ( value.constructor == Array && /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 ) ); + }, + + 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 ); + }, + + data: function( key, value ){ + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + if ( data === undefined && this.length ) + data = jQuery.data( this[0], key ); + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } else + return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ + jQuery.data( this, key, value ); + }); + }, + + removeData: function( key ){ + return this.each(function(){ + jQuery.removeData( this, key ); + }); + }, + + domManip: function( args, table, reverse, callback ) { + var clone = this.length > 1, elems; + + return this.each(function(){ + if ( !elems ) { + elems = jQuery.clean( args, this.ownerDocument ); + + if ( reverse ) + elems.reverse(); + } + + var obj = this; + + if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) ) + obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") ); + + var scripts = jQuery( [] ); + + jQuery.each(elems, function(){ + var elem = clone ? + jQuery( this ).clone( true )[0] : + this; + + // execute all scripts after the elements have been injected + if ( jQuery.nodeName( elem, "script" ) ) + scripts = scripts.add( elem ); + else { + // Remove any inner scripts for later evaluation + if ( elem.nodeType == 1 ) + scripts = scripts.add( jQuery( "script", elem ).remove() ); + + // Inject the elements into the document + callback.call( obj, elem ); + } + }); + + scripts.each( evalScript ); + }); + } +}; + +// 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 ( target.constructor == 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" && typeof target != "function" ) + 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; +}; + +var expando = "jQuery" + now(), uuid = 0, windowData = {}, + // exclude the following css properties to add px + exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) + window.jQuery = _jQuery; + + return jQuery; + }, + + // See test/unit/core.js for details concerning this function. + isFunction: function( fn ) { + return !!fn && typeof fn != "string" && !fn.nodeName && + fn.constructor != Array && /^[\s[]?function/.test( fn + "" ); + }, + + // 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.browser.msie ) + script.text = data; + else + script.appendChild( document.createTextNode( 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(); + }, + + cache: {}, + + data: function( elem, name, data ) { + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ]; + + // Compute a unique ID for the element + if ( !id ) + id = elem[ expando ] = ++uuid; + + // Only generate the data cache if we're + // trying to access or manipulate it + if ( name && !jQuery.cache[ id ] ) + jQuery.cache[ id ] = {}; + + // Prevent overriding the named cache with undefined values + if ( data !== undefined ) + jQuery.cache[ id ][ name ] = data; + + // Return the named cache data, or the ID for the element + return name ? + jQuery.cache[ id ][ name ] : + id; + }, + + removeData: function( elem, name ) { + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ]; + + // If we want to remove a specific section of the element's data + if ( name ) { + if ( jQuery.cache[ id ] ) { + // Remove the section of cache data + delete jQuery.cache[ id ][ name ]; + + // If we've removed all the data, remove the element's cache + name = ""; + + for ( name in jQuery.cache[ id ] ) + break; + + if ( !name ) + jQuery.removeData( elem ); + } + + // Otherwise, we want to remove all of the element's data + } else { + // Clean up the element expando + try { + delete elem[ expando ]; + } catch(e){ + // IE has trouble directly removing the expando + // but it's ok with using removeAttribute + if ( elem.removeAttribute ) + elem.removeAttribute( expando ); + } + + // Completely remove the data cache + delete jQuery.cache[ id ]; + } + }, + + // 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 value && value.constructor == 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; + + // A helper method for determining if an element's values are broken + function color( elem ) { + if ( !jQuery.browser.safari ) + return false; + + // defaultView is cached + var ret = defaultView.getComputedStyle( elem, null ); + return !ret || ret.getPropertyValue("color") == ""; + } + + // We need to handle opacity special in IE + if ( name == "opacity" && jQuery.browser.msie ) { + ret = jQuery.attr( style, "opacity" ); + + return ret == "" ? + "1" : + ret; + } + // Opera sometimes will give the wrong display answer, this fixes it, see #2037 + if ( jQuery.browser.opera && name == "display" ) { + var save = style.outline; + style.outline = "0 solid black"; + style.outline = save; + } + + // 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 && !color( elem ) ) + ret = computedStyle.getPropertyValue( name ); + + // If the element isn't reporting its values properly in Safari + // then some display: none elements are involved + else { + var swap = [], stack = [], a = elem, i = 0; + + // Locate all of the parent display: none elements + for ( ; a && color(a); a = a.parentNode ) + stack.unshift(a); + + // Go through and make them visible, but in reverse + // (It would be better if we knew the exact display type that they had) + for ( ; i < stack.length; i++ ) + if ( color( stack[ i ] ) ) { + swap[ i ] = stack[ i ].style.display; + stack[ i ].style.display = "block"; + } + + // Since we flip the display style, we have to handle that + // one special, otherwise get the value + ret = name == "display" && swap[ stack.length - 1 ] != null ? + "none" : + ( computedStyle && computedStyle.getPropertyValue( name ) ) || ""; + + // Finally, revert the display styles back + for ( i = 0; i < swap.length; i++ ) + if ( swap[ i ] != null ) + stack[ i ].style.display = swap[ i ]; + } + + // 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 ) { + var ret = []; + 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; + + jQuery.each(elems, function(i, elem){ + if ( !elem ) + return; + + if ( elem.constructor == Number ) + elem += ''; + + // 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(), div = context.createElement("div"); + + 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 + + + + + + +

JABAWS 2.1.0, Tomcat 7.0

+

Direct JABAWS URL is + http://<%= request.getServerName() %>/jabaws

+
+ + +
+
+
+ Manager +
+ + +
+
+
+

Resources and references

+

WARNING!!! Change passwords for security reasons!

+
    +
  • System credentials for ssh access, Web shell, and Webadmin:
    + username: root
    + password: jabaws
    + Change password with the passwd command +
  • + +
  • Tomcat admin credentials:
    + username: admin
    + password: adminjabaws
    + Change password in /srv/tomcat/conf/tomcat-users.xml +
  • + +
  • + Apache Tomcat Documentation
  • +
+ +
+
+ +
+ + diff --git a/VMrootpage/2.1.0/ROOT/js/jquery-1.2.6.js b/VMrootpage/2.1.0/ROOT/js/jquery-1.2.6.js new file mode 100644 index 0000000..88e661e --- /dev/null +++ b/VMrootpage/2.1.0/ROOT/js/jquery-1.2.6.js @@ -0,0 +1,3549 @@ +(function(){ +/* + * jQuery 1.2.6 - New Wave Javascript + * + * Copyright (c) 2008 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $ + * $Rev: 5685 $ + */ + +// Map over jQuery in case of overwrite +var _jQuery = window.jQuery, +// Map over the $ in case of overwrite + _$ = window.$; + +var jQuery = window.jQuery = window.$ = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context ); +}; + +// A simple way to check for HTML strings or ID strings +// (both of which we optimize for) +var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/, + +// Is it a simple selector + isSimple = /^.[^:#\[\.]*$/, + +// Will speed up references to undefined, and allows munging its name. + undefined; + +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; + 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 + return jQuery( elem ); + } + 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 )[ jQuery.fn.ready ? "ready" : "load" ]( selector ); + + return this.setArray(jQuery.makeArray(selector)); + }, + + // The current version of jQuery being used + jquery: "1.2.6", + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + // The number of elements contained in the matched element set + length: 0, + + // 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 ) { + // Build a new jQuery matched element set + var ret = jQuery( elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // 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 ) { + var ret = -1; + + // 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 ( name.constructor == 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 + jQuery( html, this[0].ownerDocument ) + .clone() + .insertBefore( this[0] ) + .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, false, function(elem){ + if (this.nodeType == 1) + this.appendChild( elem ); + }); + }, + + prepend: function() { + return this.domManip(arguments, true, true, function(elem){ + if (this.nodeType == 1) + this.insertBefore( elem, this.firstChild ); + }); + }, + + before: function() { + return this.domManip(arguments, false, false, function(elem){ + this.parentNode.insertBefore( elem, this ); + }); + }, + + after: function() { + return this.domManip(arguments, false, true, function(elem){ + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + }, + + end: function() { + return this.prevObject || jQuery( [] ); + }, + + find: function( selector ) { + var elems = jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + }); + + return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ? + jQuery.unique( elems ) : + elems ); + }, + + clone: function( events ) { + // Do the clone + var ret = this.map(function(){ + if ( jQuery.browser.msie && !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, this ) ); + }, + + not: function( selector ) { + if ( selector.constructor == String ) + // test special case where just one selector is passed in + if ( isSimple.test( selector ) ) + return this.pushStack( jQuery.multiFilter( selector, this, true ) ); + 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 this.is( "." + selector ); + }, + + val: function( value ) { + if ( value == undefined ) { + + if ( this.length ) { + var elem = this[0]; + + // 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.browser.msie && !option.attributes.value.specified ? option.text : option.value; + + // 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 + } else + return (this[0].value || "").replace(/\r/g, ""); + + } + + return undefined; + } + + if( value.constructor == Number ) + value += ''; + + return this.each(function(){ + if ( this.nodeType != 1 ) + return; + + if ( value.constructor == Array && /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 ) ); + }, + + 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 ); + }, + + data: function( key, value ){ + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + if ( data === undefined && this.length ) + data = jQuery.data( this[0], key ); + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } else + return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ + jQuery.data( this, key, value ); + }); + }, + + removeData: function( key ){ + return this.each(function(){ + jQuery.removeData( this, key ); + }); + }, + + domManip: function( args, table, reverse, callback ) { + var clone = this.length > 1, elems; + + return this.each(function(){ + if ( !elems ) { + elems = jQuery.clean( args, this.ownerDocument ); + + if ( reverse ) + elems.reverse(); + } + + var obj = this; + + if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) ) + obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") ); + + var scripts = jQuery( [] ); + + jQuery.each(elems, function(){ + var elem = clone ? + jQuery( this ).clone( true )[0] : + this; + + // execute all scripts after the elements have been injected + if ( jQuery.nodeName( elem, "script" ) ) + scripts = scripts.add( elem ); + else { + // Remove any inner scripts for later evaluation + if ( elem.nodeType == 1 ) + scripts = scripts.add( jQuery( "script", elem ).remove() ); + + // Inject the elements into the document + callback.call( obj, elem ); + } + }); + + scripts.each( evalScript ); + }); + } +}; + +// 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 ( target.constructor == 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" && typeof target != "function" ) + 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; +}; + +var expando = "jQuery" + now(), uuid = 0, windowData = {}, + // exclude the following css properties to add px + exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) + window.jQuery = _jQuery; + + return jQuery; + }, + + // See test/unit/core.js for details concerning this function. + isFunction: function( fn ) { + return !!fn && typeof fn != "string" && !fn.nodeName && + fn.constructor != Array && /^[\s[]?function/.test( fn + "" ); + }, + + // 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.browser.msie ) + script.text = data; + else + script.appendChild( document.createTextNode( 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(); + }, + + cache: {}, + + data: function( elem, name, data ) { + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ]; + + // Compute a unique ID for the element + if ( !id ) + id = elem[ expando ] = ++uuid; + + // Only generate the data cache if we're + // trying to access or manipulate it + if ( name && !jQuery.cache[ id ] ) + jQuery.cache[ id ] = {}; + + // Prevent overriding the named cache with undefined values + if ( data !== undefined ) + jQuery.cache[ id ][ name ] = data; + + // Return the named cache data, or the ID for the element + return name ? + jQuery.cache[ id ][ name ] : + id; + }, + + removeData: function( elem, name ) { + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ]; + + // If we want to remove a specific section of the element's data + if ( name ) { + if ( jQuery.cache[ id ] ) { + // Remove the section of cache data + delete jQuery.cache[ id ][ name ]; + + // If we've removed all the data, remove the element's cache + name = ""; + + for ( name in jQuery.cache[ id ] ) + break; + + if ( !name ) + jQuery.removeData( elem ); + } + + // Otherwise, we want to remove all of the element's data + } else { + // Clean up the element expando + try { + delete elem[ expando ]; + } catch(e){ + // IE has trouble directly removing the expando + // but it's ok with using removeAttribute + if ( elem.removeAttribute ) + elem.removeAttribute( expando ); + } + + // Completely remove the data cache + delete jQuery.cache[ id ]; + } + }, + + // 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 value && value.constructor == 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; + + // A helper method for determining if an element's values are broken + function color( elem ) { + if ( !jQuery.browser.safari ) + return false; + + // defaultView is cached + var ret = defaultView.getComputedStyle( elem, null ); + return !ret || ret.getPropertyValue("color") == ""; + } + + // We need to handle opacity special in IE + if ( name == "opacity" && jQuery.browser.msie ) { + ret = jQuery.attr( style, "opacity" ); + + return ret == "" ? + "1" : + ret; + } + // Opera sometimes will give the wrong display answer, this fixes it, see #2037 + if ( jQuery.browser.opera && name == "display" ) { + var save = style.outline; + style.outline = "0 solid black"; + style.outline = save; + } + + // 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 && !color( elem ) ) + ret = computedStyle.getPropertyValue( name ); + + // If the element isn't reporting its values properly in Safari + // then some display: none elements are involved + else { + var swap = [], stack = [], a = elem, i = 0; + + // Locate all of the parent display: none elements + for ( ; a && color(a); a = a.parentNode ) + stack.unshift(a); + + // Go through and make them visible, but in reverse + // (It would be better if we knew the exact display type that they had) + for ( ; i < stack.length; i++ ) + if ( color( stack[ i ] ) ) { + swap[ i ] = stack[ i ].style.display; + stack[ i ].style.display = "block"; + } + + // Since we flip the display style, we have to handle that + // one special, otherwise get the value + ret = name == "display" && swap[ stack.length - 1 ] != null ? + "none" : + ( computedStyle && computedStyle.getPropertyValue( name ) ) || ""; + + // Finally, revert the display styles back + for ( i = 0; i < swap.length; i++ ) + if ( swap[ i ] != null ) + stack[ i ].style.display = swap[ i ]; + } + + // 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 ) { + var ret = []; + 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; + + jQuery.each(elems, function(i, elem){ + if ( !elem ) + return; + + if ( elem.constructor == Number ) + elem += ''; + + // 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(), div = context.createElement("div"); + + 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