]> gitweb.fluxo.info Git - semanticscuttle.git/commitdiff
make sidebar menu2 use jquery.jstree. ajax loading of subtags is still missing
authorChristian Weiske <cweiske@cweiske.de>
Thu, 30 Sep 2010 17:12:49 +0000 (19:12 +0200)
committerChristian Weiske <cweiske@cweiske.de>
Thu, 30 Sep 2010 17:12:49 +0000 (19:12 +0200)
23 files changed:
data/templates/sidebar.block.menu2.php
www/js/jquery-1.4.2.js [new file with mode: 0644]
www/js/jquery-1.4.2.min.js [new file with mode: 0644]
www/js/jquery.jstree.js [new file with mode: 0644]
www/js/themes/apple/bg.jpg [new file with mode: 0644]
www/js/themes/apple/d.png [new file with mode: 0644]
www/js/themes/apple/dot_for_ie.gif [new file with mode: 0644]
www/js/themes/apple/style.css [new file with mode: 0644]
www/js/themes/apple/throbber.gif [new file with mode: 0644]
www/js/themes/classic/d.png [new file with mode: 0644]
www/js/themes/classic/dot_for_ie.gif [new file with mode: 0644]
www/js/themes/classic/style.css [new file with mode: 0644]
www/js/themes/classic/throbber.gif [new file with mode: 0644]
www/js/themes/default-rtl/d.gif [new file with mode: 0644]
www/js/themes/default-rtl/d.png [new file with mode: 0644]
www/js/themes/default-rtl/dots.gif [new file with mode: 0644]
www/js/themes/default-rtl/style.css [new file with mode: 0644]
www/js/themes/default-rtl/throbber.gif [new file with mode: 0644]
www/js/themes/default/d.gif [new file with mode: 0644]
www/js/themes/default/d.png [new file with mode: 0644]
www/js/themes/default/style.css [new file with mode: 0644]
www/js/themes/default/throbber.gif [new file with mode: 0644]
www/scuttle.css

index 00ad74fcbeb9fed27db7747af4c18a0d93e95b19..81ee121367ba98046ad9f51eb768552acfa318af 100644 (file)
@@ -1,3 +1,5 @@
+<script type="text/javascript" src="<?php echo ROOT ?>js/jquery-1.4.2.js"></script>
+<script type="text/javascript" src="<?php echo ROOT ?>js/jquery.jstree.js"></script>
 <?php
 /* Service creation: only useful services are created */
 $tag2tagservice =SemanticScuttle_Service_Factory::get('Tag2Tag');
@@ -31,7 +33,7 @@ if (count($menu2Tags) > 0) {
 foreach ($menu2Tags as $menu2Tag) {
     echo '  <li>'
         . sprintf(
-            '<a href="%s">%s</a>',
+            '<a href="%s">%s</a><ul><li><a href="#">foo</a></li><li><a href="#">bar</a></li></ul>',
             sprintf($cat_url, $menu2Tag),
             $menu2Tag
         )
@@ -46,10 +48,22 @@ foreach ($menu2Tags as $menu2Tag) {
        echo '</div>';
     */
 }
+//ROOT.'ajax/getadminlinkedtags.php?tag='.filter($menu2Tag, 'url')
 ?>
  </ul>
 </div>
-
+<script type="text/javascript">
+jQuery("#maintagsmenu")
+.jstree({
+    "themes" : {
+        "theme": "default",
+        "dots": false,
+        "icons": true,
+        "url": '<?php echo ROOT ?>js/themes/default/style.css'
+    },
+    plugins : [ "themes", "html_data"],
+});
+</script>
 <?php
 }
 ?>
diff --git a/www/js/jquery-1.4.2.js b/www/js/jquery-1.4.2.js
new file mode 100644 (file)
index 0000000..fff6776
--- /dev/null
@@ -0,0 +1,6240 @@
+/*!
+ * jQuery JavaScript Library v1.4.2
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Sat Feb 13 22:33:48 2010 -0500
+ */
+(function( window, undefined ) {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+               // The jQuery object is actually just the init constructor 'enhanced'
+               return new jQuery.fn.init( selector, context );
+       },
+
+       // Map over jQuery in case of overwrite
+       _jQuery = window.jQuery,
+
+       // Map over the $ in case of overwrite
+       _$ = window.$,
+
+       // Use the correct document accordingly with window argument (sandbox)
+       document = window.document,
+
+       // A central reference to the root jQuery(document)
+       rootjQuery,
+
+       // A simple way to check for HTML strings or ID strings
+       // (both of which we optimize for)
+       quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,
+
+       // Is it a simple selector
+       isSimple = /^.[^:#\[\.,]*$/,
+
+       // Check if a string has a non-whitespace character in it
+       rnotwhite = /\S/,
+
+       // Used for trimming whitespace
+       rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g,
+
+       // Match a standalone tag
+       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+       // Keep a UserAgent string for use with jQuery.browser
+       userAgent = navigator.userAgent,
+
+       // For matching the engine and version of the browser
+       browserMatch,
+       
+       // Has the ready events already been bound?
+       readyBound = false,
+       
+       // The functions to execute on DOM ready
+       readyList = [],
+
+       // The ready event handler
+       DOMContentLoaded,
+
+       // Save a reference to some core methods
+       toString = Object.prototype.toString,
+       hasOwnProperty = Object.prototype.hasOwnProperty,
+       push = Array.prototype.push,
+       slice = Array.prototype.slice,
+       indexOf = Array.prototype.indexOf;
+
+jQuery.fn = jQuery.prototype = {
+       init: function( selector, context ) {
+               var match, elem, ret, doc;
+
+               // Handle $(""), $(null), or $(undefined)
+               if ( !selector ) {
+                       return this;
+               }
+
+               // Handle $(DOMElement)
+               if ( selector.nodeType ) {
+                       this.context = this[0] = selector;
+                       this.length = 1;
+                       return this;
+               }
+               
+               // The body element only exists once, optimize finding it
+               if ( selector === "body" && !context ) {
+                       this.context = document;
+                       this[0] = document.body;
+                       this.selector = "body";
+                       this.length = 1;
+                       return this;
+               }
+
+               // Handle HTML strings
+               if ( typeof selector === "string" ) {
+                       // Are we dealing with HTML string or an ID?
+                       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] ) {
+                                       doc = (context ? context.ownerDocument || context : document);
+
+                                       // If a single string is passed in and it's a single tag
+                                       // just do a createElement and skip the rest
+                                       ret = rsingleTag.exec( selector );
+
+                                       if ( ret ) {
+                                               if ( jQuery.isPlainObject( context ) ) {
+                                                       selector = [ document.createElement( ret[1] ) ];
+                                                       jQuery.fn.attr.call( selector, context, true );
+
+                                               } else {
+                                                       selector = [ doc.createElement( ret[1] ) ];
+                                               }
+
+                                       } else {
+                                               ret = buildFragment( [ match[1] ], [ doc ] );
+                                               selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
+                                       }
+                                       
+                                       return jQuery.merge( this, selector );
+                                       
+                               // HANDLE: $("#id")
+                               } else {
+                                       elem = document.getElementById( match[2] );
+
+                                       if ( elem ) {
+                                               // Handle the case where IE and Opera return items
+                                               // by name instead of ID
+                                               if ( elem.id !== match[2] ) {
+                                                       return rootjQuery.find( selector );
+                                               }
+
+                                               // Otherwise, we inject the element directly into the jQuery object
+                                               this.length = 1;
+                                               this[0] = elem;
+                                       }
+
+                                       this.context = document;
+                                       this.selector = selector;
+                                       return this;
+                               }
+
+                       // HANDLE: $("TAG")
+                       } else if ( !context && /^\w+$/.test( selector ) ) {
+                               this.selector = selector;
+                               this.context = document;
+                               selector = document.getElementsByTagName( selector );
+                               return jQuery.merge( this, selector );
+
+                       // HANDLE: $(expr, $(...))
+                       } else if ( !context || context.jquery ) {
+                               return (context || rootjQuery).find( selector );
+
+                       // HANDLE: $(expr, context)
+                       // (which is just equivalent to: $(context).find(expr)
+                       } else {
+                               return jQuery( context ).find( selector );
+                       }
+
+               // HANDLE: $(function)
+               // Shortcut for document ready
+               } else if ( jQuery.isFunction( selector ) ) {
+                       return rootjQuery.ready( selector );
+               }
+
+               if (selector.selector !== undefined) {
+                       this.selector = selector.selector;
+                       this.context = selector.context;
+               }
+
+               return jQuery.makeArray( selector, this );
+       },
+
+       // Start with an empty selector
+       selector: "",
+
+       // The current version of jQuery being used
+       jquery: "1.4.2",
+
+       // The default length of a jQuery object is 0
+       length: 0,
+
+       // The number of elements contained in the matched element set
+       size: function() {
+               return this.length;
+       },
+
+       toArray: function() {
+               return slice.call( this, 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 == null ?
+
+                       // Return a 'clean' array
+                       this.toArray() :
+
+                       // Return just the object
+                       ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
+       },
+
+       // Take an array of elements and push it onto the stack
+       // (returning the new matched element set)
+       pushStack: function( elems, name, selector ) {
+               // Build a new jQuery matched element set
+               var ret = jQuery();
+
+               if ( jQuery.isArray( elems ) ) {
+                       push.apply( ret, elems );
+               
+               } else {
+                       jQuery.merge( ret, elems );
+               }
+
+               // Add the old object onto the stack (as a reference)
+               ret.prevObject = this;
+
+               ret.context = this.context;
+
+               if ( name === "find" ) {
+                       ret.selector = this.selector + (this.selector ? " " : "") + selector;
+               } else if ( name ) {
+                       ret.selector = this.selector + "." + name + "(" + selector + ")";
+               }
+
+               // Return the newly-formed element set
+               return ret;
+       },
+
+       // 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 );
+       },
+       
+       ready: function( fn ) {
+               // Attach the listeners
+               jQuery.bindReady();
+
+               // If the DOM is already ready
+               if ( jQuery.isReady ) {
+                       // Execute the function immediately
+                       fn.call( document, jQuery );
+
+               // Otherwise, remember the function for later
+               } else if ( readyList ) {
+                       // Add the function to the wait list
+                       readyList.push( fn );
+               }
+
+               return this;
+       },
+       
+       eq: function( i ) {
+               return i === -1 ?
+                       this.slice( i ) :
+                       this.slice( i, +i + 1 );
+       },
+
+       first: function() {
+               return this.eq( 0 );
+       },
+
+       last: function() {
+               return this.eq( -1 );
+       },
+
+       slice: function() {
+               return this.pushStack( slice.apply( this, arguments ),
+                       "slice", slice.call(arguments).join(",") );
+       },
+
+       map: function( callback ) {
+               return this.pushStack( jQuery.map(this, function( elem, i ) {
+                       return callback.call( elem, i, elem );
+               }));
+       },
+       
+       end: function() {
+               return this.prevObject || jQuery(null);
+       },
+
+       // For internal use only.
+       // Behaves like an Array's method, not like a jQuery method.
+       push: push,
+       sort: [].sort,
+       splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+       // copy reference to target object
+       var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
+
+       // Handle a deep copy situation
+       if ( typeof target === "boolean" ) {
+               deep = target;
+               target = arguments[1] || {};
+               // skip the boolean and the target
+               i = 2;
+       }
+
+       // Handle case when target is a string or something (possible in deep copy)
+       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+               target = {};
+       }
+
+       // extend jQuery itself if only one argument is passed
+       if ( length === i ) {
+               target = this;
+               --i;
+       }
+
+       for ( ; i < length; i++ ) {
+               // Only deal with non-null/undefined values
+               if ( (options = arguments[ i ]) != null ) {
+                       // Extend the base object
+                       for ( name in options ) {
+                               src = target[ name ];
+                               copy = options[ name ];
+
+                               // Prevent never-ending loop
+                               if ( target === copy ) {
+                                       continue;
+                               }
+
+                               // Recurse if we're merging object literal values or arrays
+                               if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
+                                       var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
+                                               : jQuery.isArray(copy) ? [] : {};
+
+                                       // Never move original objects, clone them
+                                       target[ name ] = jQuery.extend( deep, clone, copy );
+
+                               // Don't bring in undefined values
+                               } else if ( copy !== undefined ) {
+                                       target[ name ] = copy;
+                               }
+                       }
+               }
+       }
+
+       // Return the modified object
+       return target;
+};
+
+jQuery.extend({
+       noConflict: function( deep ) {
+               window.$ = _$;
+
+               if ( deep ) {
+                       window.jQuery = _jQuery;
+               }
+
+               return jQuery;
+       },
+       
+       // Is the DOM ready to be used? Set to true once it occurs.
+       isReady: false,
+       
+       // Handle when the DOM is ready
+       ready: function() {
+               // Make sure that the DOM is not already loaded
+               if ( !jQuery.isReady ) {
+                       // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+                       if ( !document.body ) {
+                               return setTimeout( jQuery.ready, 13 );
+                       }
+
+                       // Remember that the DOM is ready
+                       jQuery.isReady = true;
+
+                       // If there are functions bound, to execute
+                       if ( readyList ) {
+                               // Execute all of them
+                               var fn, i = 0;
+                               while ( (fn = readyList[ i++ ]) ) {
+                                       fn.call( document, jQuery );
+                               }
+
+                               // Reset the list of functions
+                               readyList = null;
+                       }
+
+                       // Trigger any bound ready events
+                       if ( jQuery.fn.triggerHandler ) {
+                               jQuery( document ).triggerHandler( "ready" );
+                       }
+               }
+       },
+       
+       bindReady: function() {
+               if ( readyBound ) {
+                       return;
+               }
+
+               readyBound = true;
+
+               // Catch cases where $(document).ready() is called after the
+               // browser event has already occurred.
+               if ( document.readyState === "complete" ) {
+                       return jQuery.ready();
+               }
+
+               // Mozilla, Opera and webkit nightlies currently support this event
+               if ( document.addEventListener ) {
+                       // Use the handy event callback
+                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+                       
+                       // A fallback to window.onload, that will always work
+                       window.addEventListener( "load", jQuery.ready, false );
+
+               // If IE event model is used
+               } else if ( document.attachEvent ) {
+                       // ensure firing before onload,
+                       // maybe late but safe also for iframes
+                       document.attachEvent("onreadystatechange", DOMContentLoaded);
+                       
+                       // A fallback to window.onload, that will always work
+                       window.attachEvent( "onload", jQuery.ready );
+
+                       // If IE and not a frame
+                       // continually check to see if the document is ready
+                       var toplevel = false;
+
+                       try {
+                               toplevel = window.frameElement == null;
+                       } catch(e) {}
+
+                       if ( document.documentElement.doScroll && toplevel ) {
+                               doScrollCheck();
+                       }
+               }
+       },
+
+       // See test/unit/core.js for details concerning isFunction.
+       // Since version 1.3, DOM methods and functions like alert
+       // aren't supported. They return false on IE (#2968).
+       isFunction: function( obj ) {
+               return toString.call(obj) === "[object Function]";
+       },
+
+       isArray: function( obj ) {
+               return toString.call(obj) === "[object Array]";
+       },
+
+       isPlainObject: function( obj ) {
+               // Must be an Object.
+               // Because of IE, we also have to check the presence of the constructor property.
+               // Make sure that DOM nodes and window objects don't pass through, as well
+               if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
+                       return false;
+               }
+               
+               // Not own constructor property must be Object
+               if ( obj.constructor
+                       && !hasOwnProperty.call(obj, "constructor")
+                       && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
+                       return false;
+               }
+               
+               // Own properties are enumerated firstly, so to speed up,
+               // if last one is own, then all properties are own.
+       
+               var key;
+               for ( key in obj ) {}
+               
+               return key === undefined || hasOwnProperty.call( obj, key );
+       },
+
+       isEmptyObject: function( obj ) {
+               for ( var name in obj ) {
+                       return false;
+               }
+               return true;
+       },
+       
+       error: function( msg ) {
+               throw msg;
+       },
+       
+       parseJSON: function( data ) {
+               if ( typeof data !== "string" || !data ) {
+                       return null;
+               }
+
+               // Make sure leading/trailing whitespace is removed (IE can't handle it)
+               data = jQuery.trim( data );
+               
+               // Make sure the incoming data is actual JSON
+               // Logic borrowed from http://json.org/json2.js
+               if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
+                       .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
+                       .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {
+
+                       // Try to use the native JSON parser first
+                       return window.JSON && window.JSON.parse ?
+                               window.JSON.parse( data ) :
+                               (new Function("return " + data))();
+
+               } else {
+                       jQuery.error( "Invalid JSON: " + data );
+               }
+       },
+
+       noop: function() {},
+
+       // Evalulates a script in a global context
+       globalEval: function( data ) {
+               if ( data && rnotwhite.test(data) ) {
+                       // Inspired by code by Andrea Giammarchi
+                       // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
+                       var head = document.getElementsByTagName("head")[0] || document.documentElement,
+                               script = document.createElement("script");
+
+                       script.type = "text/javascript";
+
+                       if ( jQuery.support.scriptEval ) {
+                               script.appendChild( document.createTextNode( data ) );
+                       } else {
+                               script.text = data;
+                       }
+
+                       // Use insertBefore instead of appendChild to circumvent an IE6 bug.
+                       // This arises when a base node is used (#2709).
+                       head.insertBefore( script, head.firstChild );
+                       head.removeChild( script );
+               }
+       },
+
+       nodeName: function( elem, name ) {
+               return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+       },
+
+       // args is for internal usage only
+       each: function( object, callback, args ) {
+               var name, i = 0,
+                       length = object.length,
+                       isObj = length === undefined || jQuery.isFunction(object);
+
+               if ( args ) {
+                       if ( isObj ) {
+                               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 ( isObj ) {
+                               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;
+       },
+
+       trim: function( text ) {
+               return (text || "").replace( rtrim, "" );
+       },
+
+       // results is for internal usage only
+       makeArray: function( array, results ) {
+               var ret = results || [];
+
+               if ( array != null ) {
+                       // The window, strings (and functions) also have 'length'
+                       // The extra typeof function check is to prevent crashes
+                       // in Safari 2 (See: #3039)
+                       if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) {
+                               push.call( ret, array );
+                       } else {
+                               jQuery.merge( ret, array );
+                       }
+               }
+
+               return ret;
+       },
+
+       inArray: function( elem, array ) {
+               if ( array.indexOf ) {
+                       return array.indexOf( elem );
+               }
+
+               for ( var i = 0, length = array.length; i < length; i++ ) {
+                       if ( array[ i ] === elem ) {
+                               return i;
+                       }
+               }
+
+               return -1;
+       },
+
+       merge: function( first, second ) {
+               var i = first.length, j = 0;
+
+               if ( typeof second.length === "number" ) {
+                       for ( var l = second.length; j < l; j++ ) {
+                               first[ i++ ] = second[ j ];
+                       }
+               
+               } else {
+                       while ( second[j] !== undefined ) {
+                               first[ i++ ] = second[ j++ ];
+                       }
+               }
+
+               first.length = i;
+
+               return first;
+       },
+
+       grep: function( elems, callback, inv ) {
+               var ret = [];
+
+               // Go through the array, only saving the items
+               // that pass the validator function
+               for ( var i = 0, length = elems.length; i < length; i++ ) {
+                       if ( !inv !== !callback( elems[ i ], i ) ) {
+                               ret.push( elems[ i ] );
+                       }
+               }
+
+               return ret;
+       },
+
+       // arg is for internal usage only
+       map: function( elems, callback, arg ) {
+               var ret = [], value;
+
+               // Go through the array, translating each of the items to their
+               // new value (or values).
+               for ( var i = 0, length = elems.length; i < length; i++ ) {
+                       value = callback( elems[ i ], i, arg );
+
+                       if ( value != null ) {
+                               ret[ ret.length ] = value;
+                       }
+               }
+
+               return ret.concat.apply( [], ret );
+       },
+
+       // A global GUID counter for objects
+       guid: 1,
+
+       proxy: function( fn, proxy, thisObject ) {
+               if ( arguments.length === 2 ) {
+                       if ( typeof proxy === "string" ) {
+                               thisObject = fn;
+                               fn = thisObject[ proxy ];
+                               proxy = undefined;
+
+                       } else if ( proxy && !jQuery.isFunction( proxy ) ) {
+                               thisObject = proxy;
+                               proxy = undefined;
+                       }
+               }
+
+               if ( !proxy && fn ) {
+                       proxy = function() {
+                               return fn.apply( thisObject || this, arguments );
+                       };
+               }
+
+               // Set the guid of unique handler to the same of original handler, so it can be removed
+               if ( fn ) {
+                       proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+               }
+
+               // So proxy can be declared as an argument
+               return proxy;
+       },
+
+       // Use of jQuery.browser is frowned upon.
+       // More details: http://docs.jquery.com/Utilities/jQuery.browser
+       uaMatch: function( ua ) {
+               ua = ua.toLowerCase();
+
+               var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+                       /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) ||
+                       /(msie) ([\w.]+)/.exec( ua ) ||
+                       !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) ||
+                       [];
+
+               return { browser: match[1] || "", version: match[2] || "0" };
+       },
+
+       browser: {}
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+       jQuery.browser[ browserMatch.browser ] = true;
+       jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+       jQuery.browser.safari = true;
+}
+
+if ( indexOf ) {
+       jQuery.inArray = function( elem, array ) {
+               return indexOf.call( array, elem );
+       };
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+       DOMContentLoaded = function() {
+               document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+               jQuery.ready();
+       };
+
+} else if ( document.attachEvent ) {
+       DOMContentLoaded = function() {
+               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+               if ( document.readyState === "complete" ) {
+                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
+                       jQuery.ready();
+               }
+       };
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+       if ( jQuery.isReady ) {
+               return;
+       }
+
+       try {
+               // If IE is used, use the trick by Diego Perini
+               // http://javascript.nwbox.com/IEContentLoaded/
+               document.documentElement.doScroll("left");
+       } catch( error ) {
+               setTimeout( doScrollCheck, 1 );
+               return;
+       }
+
+       // and execute any waiting functions
+       jQuery.ready();
+}
+
+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 );
+       }
+}
+
+// Mutifunctional method to get and set values to a collection
+// The value/s can be optionally by executed if its a function
+function access( elems, key, value, exec, fn, pass ) {
+       var length = elems.length;
+       
+       // Setting many attributes
+       if ( typeof key === "object" ) {
+               for ( var k in key ) {
+                       access( elems, k, key[k], exec, fn, value );
+               }
+               return elems;
+       }
+       
+       // Setting one attribute
+       if ( value !== undefined ) {
+               // Optionally, function values get executed if exec is true
+               exec = !pass && exec && jQuery.isFunction(value);
+               
+               for ( var i = 0; i < length; i++ ) {
+                       fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+               }
+               
+               return elems;
+       }
+       
+       // Getting an attribute
+       return length ? fn( elems[0], key ) : undefined;
+}
+
+function now() {
+       return (new Date).getTime();
+}
+(function() {
+
+       jQuery.support = {};
+
+       var root = document.documentElement,
+               script = document.createElement("script"),
+               div = document.createElement("div"),
+               id = "script" + now();
+
+       div.style.display = "none";
+       div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+       var all = div.getElementsByTagName("*"),
+               a = div.getElementsByTagName("a")[0];
+
+       // Can't get basic test support
+       if ( !all || !all.length || !a ) {
+               return;
+       }
+
+       jQuery.support = {
+               // IE strips leading whitespace when .innerHTML is used
+               leadingWhitespace: div.firstChild.nodeType === 3,
+
+               // Make sure that tbody elements aren't automatically inserted
+               // IE will insert them into empty tables
+               tbody: !div.getElementsByTagName("tbody").length,
+
+               // Make sure that link elements get serialized correctly by innerHTML
+               // This requires a wrapper element in IE
+               htmlSerialize: !!div.getElementsByTagName("link").length,
+
+               // Get the style information from getAttribute
+               // (IE uses .cssText insted)
+               style: /red/.test( a.getAttribute("style") ),
+
+               // Make sure that URLs aren't manipulated
+               // (IE normalizes it by default)
+               hrefNormalized: a.getAttribute("href") === "/a",
+
+               // Make sure that element opacity exists
+               // (IE uses filter instead)
+               // Use a regex to work around a WebKit issue. See #5145
+               opacity: /^0.55$/.test( a.style.opacity ),
+
+               // Verify style float existence
+               // (IE uses styleFloat instead of cssFloat)
+               cssFloat: !!a.style.cssFloat,
+
+               // Make sure that if no value is specified for a checkbox
+               // that it defaults to "on".
+               // (WebKit defaults to "" instead)
+               checkOn: div.getElementsByTagName("input")[0].value === "on",
+
+               // Make sure that a selected-by-default option has a working selected property.
+               // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+               optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected,
+
+               parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null,
+
+               // Will be defined later
+               deleteExpando: true,
+               checkClone: false,
+               scriptEval: false,
+               noCloneEvent: true,
+               boxModel: null
+       };
+
+       script.type = "text/javascript";
+       try {
+               script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
+       } catch(e) {}
+
+       root.insertBefore( script, root.firstChild );
+
+       // Make sure that the execution of code works by injecting a script
+       // tag with appendChild/createTextNode
+       // (IE doesn't support this, fails, and uses .text instead)
+       if ( window[ id ] ) {
+               jQuery.support.scriptEval = true;
+               delete window[ id ];
+       }
+
+       // Test to see if it's possible to delete an expando from an element
+       // Fails in Internet Explorer
+       try {
+               delete script.test;
+       
+       } catch(e) {
+               jQuery.support.deleteExpando = false;
+       }
+
+       root.removeChild( script );
+
+       if ( div.attachEvent && div.fireEvent ) {
+               div.attachEvent("onclick", function click() {
+                       // Cloning a node shouldn't copy over any
+                       // bound event handlers (IE does this)
+                       jQuery.support.noCloneEvent = false;
+                       div.detachEvent("onclick", click);
+               });
+               div.cloneNode(true).fireEvent("onclick");
+       }
+
+       div = document.createElement("div");
+       div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
+
+       var fragment = document.createDocumentFragment();
+       fragment.appendChild( div.firstChild );
+
+       // WebKit doesn't clone checked state correctly in fragments
+       jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
+
+       // Figure out if the W3C box model works as expected
+       // document.body must exist before we can do this
+       jQuery(function() {
+               var div = document.createElement("div");
+               div.style.width = div.style.paddingLeft = "1px";
+
+               document.body.appendChild( div );
+               jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
+               document.body.removeChild( div ).style.display = 'none';
+
+               div = null;
+       });
+
+       // Technique from Juriy Zaytsev
+       // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
+       var eventSupported = function( eventName ) { 
+               var el = document.createElement("div"); 
+               eventName = "on" + eventName; 
+
+               var isSupported = (eventName in el); 
+               if ( !isSupported ) { 
+                       el.setAttribute(eventName, "return;"); 
+                       isSupported = typeof el[eventName] === "function"; 
+               } 
+               el = null; 
+
+               return isSupported; 
+       };
+       
+       jQuery.support.submitBubbles = eventSupported("submit");
+       jQuery.support.changeBubbles = eventSupported("change");
+
+       // release memory in IE
+       root = script = div = all = a = null;
+})();
+
+jQuery.props = {
+       "for": "htmlFor",
+       "class": "className",
+       readonly: "readOnly",
+       maxlength: "maxLength",
+       cellspacing: "cellSpacing",
+       rowspan: "rowSpan",
+       colspan: "colSpan",
+       tabindex: "tabIndex",
+       usemap: "useMap",
+       frameborder: "frameBorder"
+};
+var expando = "jQuery" + now(), uuid = 0, windowData = {};
+
+jQuery.extend({
+       cache: {},
+       
+       expando:expando,
+
+       // The following elements throw uncatchable exceptions if you
+       // attempt to add expando properties to them.
+       noData: {
+               "embed": true,
+               "object": true,
+               "applet": true
+       },
+
+       data: function( elem, name, data ) {
+               if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+                       return;
+               }
+
+               elem = elem == window ?
+                       windowData :
+                       elem;
+
+               var id = elem[ expando ], cache = jQuery.cache, thisCache;
+
+               if ( !id && typeof name === "string" && data === undefined ) {
+                       return null;
+               }
+
+               // Compute a unique ID for the element
+               if ( !id ) { 
+                       id = ++uuid;
+               }
+
+               // Avoid generating a new cache unless none exists and we
+               // want to manipulate it.
+               if ( typeof name === "object" ) {
+                       elem[ expando ] = id;
+                       thisCache = cache[ id ] = jQuery.extend(true, {}, name);
+
+               } else if ( !cache[ id ] ) {
+                       elem[ expando ] = id;
+                       cache[ id ] = {};
+               }
+
+               thisCache = cache[ id ];
+
+               // Prevent overriding the named cache with undefined values
+               if ( data !== undefined ) {
+                       thisCache[ name ] = data;
+               }
+
+               return typeof name === "string" ? thisCache[ name ] : thisCache;
+       },
+
+       removeData: function( elem, name ) {
+               if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+                       return;
+               }
+
+               elem = elem == window ?
+                       windowData :
+                       elem;
+
+               var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];
+
+               // If we want to remove a specific section of the element's data
+               if ( name ) {
+                       if ( thisCache ) {
+                               // Remove the section of cache data
+                               delete thisCache[ name ];
+
+                               // If we've removed all the data, remove the element's cache
+                               if ( jQuery.isEmptyObject(thisCache) ) {
+                                       jQuery.removeData( elem );
+                               }
+                       }
+
+               // Otherwise, we want to remove all of the element's data
+               } else {
+                       if ( jQuery.support.deleteExpando ) {
+                               delete elem[ jQuery.expando ];
+
+                       } else if ( elem.removeAttribute ) {
+                               elem.removeAttribute( jQuery.expando );
+                       }
+
+                       // Completely remove the data cache
+                       delete cache[ id ];
+               }
+       }
+});
+
+jQuery.fn.extend({
+       data: function( key, value ) {
+               if ( typeof key === "undefined" && this.length ) {
+                       return jQuery.data( this[0] );
+
+               } else if ( typeof key === "object" ) {
+                       return this.each(function() {
+                               jQuery.data( this, key );
+                       });
+               }
+
+               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 );
+               });
+       }
+});
+jQuery.extend({
+       queue: function( elem, type, data ) {
+               if ( !elem ) {
+                       return;
+               }
+
+               type = (type || "fx") + "queue";
+               var q = jQuery.data( elem, type );
+
+               // Speed up dequeue by getting out quickly if this is just a lookup
+               if ( !data ) {
+                       return q || [];
+               }
+
+               if ( !q || jQuery.isArray(data) ) {
+                       q = jQuery.data( elem, type, jQuery.makeArray(data) );
+
+               } else {
+                       q.push( data );
+               }
+
+               return q;
+       },
+
+       dequeue: function( elem, type ) {
+               type = type || "fx";
+
+               var queue = jQuery.queue( elem, type ), fn = queue.shift();
+
+               // If the fx queue is dequeued, always remove the progress sentinel
+               if ( fn === "inprogress" ) {
+                       fn = queue.shift();
+               }
+
+               if ( fn ) {
+                       // Add a progress sentinel to prevent the fx queue from being
+                       // automatically dequeued
+                       if ( type === "fx" ) {
+                               queue.unshift("inprogress");
+                       }
+
+                       fn.call(elem, function() {
+                               jQuery.dequeue(elem, type);
+                       });
+               }
+       }
+});
+
+jQuery.fn.extend({
+       queue: function( type, data ) {
+               if ( typeof type !== "string" ) {
+                       data = type;
+                       type = "fx";
+               }
+
+               if ( data === undefined ) {
+                       return jQuery.queue( this[0], type );
+               }
+               return this.each(function( i, elem ) {
+                       var queue = jQuery.queue( this, type, data );
+
+                       if ( type === "fx" && queue[0] !== "inprogress" ) {
+                               jQuery.dequeue( this, type );
+                       }
+               });
+       },
+       dequeue: function( type ) {
+               return this.each(function() {
+                       jQuery.dequeue( this, type );
+               });
+       },
+
+       // Based off of the plugin by Clint Helfers, with permission.
+       // http://blindsignals.com/index.php/2009/07/jquery-delay/
+       delay: function( time, type ) {
+               time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
+               type = type || "fx";
+
+               return this.queue( type, function() {
+                       var elem = this;
+                       setTimeout(function() {
+                               jQuery.dequeue( elem, type );
+                       }, time );
+               });
+       },
+
+       clearQueue: function( type ) {
+               return this.queue( type || "fx", [] );
+       }
+});
+var rclass = /[\n\t]/g,
+       rspace = /\s+/,
+       rreturn = /\r/g,
+       rspecialurl = /href|src|style/,
+       rtype = /(button|input)/i,
+       rfocusable = /(button|input|object|select|textarea)/i,
+       rclickable = /^(a|area)$/i,
+       rradiocheck = /radio|checkbox/;
+
+jQuery.fn.extend({
+       attr: function( name, value ) {
+               return access( this, name, value, true, jQuery.attr );
+       },
+
+       removeAttr: function( name, fn ) {
+               return this.each(function(){
+                       jQuery.attr( this, name, "" );
+                       if ( this.nodeType === 1 ) {
+                               this.removeAttribute( name );
+                       }
+               });
+       },
+
+       addClass: function( value ) {
+               if ( jQuery.isFunction(value) ) {
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               self.addClass( value.call(this, i, self.attr("class")) );
+                       });
+               }
+
+               if ( value && typeof value === "string" ) {
+                       var classNames = (value || "").split( rspace );
+
+                       for ( var i = 0, l = this.length; i < l; i++ ) {
+                               var elem = this[i];
+
+                               if ( elem.nodeType === 1 ) {
+                                       if ( !elem.className ) {
+                                               elem.className = value;
+
+                                       } else {
+                                               var className = " " + elem.className + " ", setClass = elem.className;
+                                               for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
+                                                       if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
+                                                               setClass += " " + classNames[c];
+                                                       }
+                                               }
+                                               elem.className = jQuery.trim( setClass );
+                                       }
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       removeClass: function( value ) {
+               if ( jQuery.isFunction(value) ) {
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               self.removeClass( value.call(this, i, self.attr("class")) );
+                       });
+               }
+
+               if ( (value && typeof value === "string") || value === undefined ) {
+                       var classNames = (value || "").split(rspace);
+
+                       for ( var i = 0, l = this.length; i < l; i++ ) {
+                               var elem = this[i];
+
+                               if ( elem.nodeType === 1 && elem.className ) {
+                                       if ( value ) {
+                                               var className = (" " + elem.className + " ").replace(rclass, " ");
+                                               for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
+                                                       className = className.replace(" " + classNames[c] + " ", " ");
+                                               }
+                                               elem.className = jQuery.trim( className );
+
+                                       } else {
+                                               elem.className = "";
+                                       }
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       toggleClass: function( value, stateVal ) {
+               var type = typeof value, isBool = typeof stateVal === "boolean";
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
+                       });
+               }
+
+               return this.each(function() {
+                       if ( type === "string" ) {
+                               // toggle individual class names
+                               var className, i = 0, self = jQuery(this),
+                                       state = stateVal,
+                                       classNames = value.split( rspace );
+
+                               while ( (className = classNames[ i++ ]) ) {
+                                       // check each className given, space seperated list
+                                       state = isBool ? state : !self.hasClass( className );
+                                       self[ state ? "addClass" : "removeClass" ]( className );
+                               }
+
+                       } else if ( type === "undefined" || type === "boolean" ) {
+                               if ( this.className ) {
+                                       // store className if set
+                                       jQuery.data( this, "__className__", this.className );
+                               }
+
+                               // toggle whole className
+                               this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
+                       }
+               });
+       },
+
+       hasClass: function( selector ) {
+               var className = " " + selector + " ";
+               for ( var i = 0, l = this.length; i < l; i++ ) {
+                       if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       },
+
+       val: function( value ) {
+               if ( value === undefined ) {
+                       var elem = this[0];
+
+                       if ( elem ) {
+                               if ( jQuery.nodeName( elem, "option" ) ) {
+                                       return (elem.attributes.value || {}).specified ? elem.value : elem.text;
+                               }
+
+                               // We need to handle select boxes special
+                               if ( jQuery.nodeName( elem, "select" ) ) {
+                                       var index = elem.selectedIndex,
+                                               values = [],
+                                               options = elem.options,
+                                               one = elem.type === "select-one";
+
+                                       // Nothing was selected
+                                       if ( index < 0 ) {
+                                               return null;
+                                       }
+
+                                       // Loop through all the selected options
+                                       for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+                                               var option = options[ i ];
+
+                                               if ( option.selected ) {
+                                                       // Get the specifc value for the option
+                                                       value = jQuery(option).val();
+
+                                                       // We don't need an array for one selects
+                                                       if ( one ) {
+                                                               return value;
+                                                       }
+
+                                                       // Multi-Selects return an array
+                                                       values.push( value );
+                                               }
+                                       }
+
+                                       return values;
+                               }
+
+                               // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+                               if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
+                                       return elem.getAttribute("value") === null ? "on" : elem.value;
+                               }
+                               
+
+                               // Everything else, we just grab the value
+                               return (elem.value || "").replace(rreturn, "");
+
+                       }
+
+                       return undefined;
+               }
+
+               var isFunction = jQuery.isFunction(value);
+
+               return this.each(function(i) {
+                       var self = jQuery(this), val = value;
+
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
+
+                       if ( isFunction ) {
+                               val = value.call(this, i, self.val());
+                       }
+
+                       // Typecast each time if the value is a Function and the appended
+                       // value is therefore different each time.
+                       if ( typeof val === "number" ) {
+                               val += "";
+                       }
+
+                       if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
+                               this.checked = jQuery.inArray( self.val(), val ) >= 0;
+
+                       } else if ( jQuery.nodeName( this, "select" ) ) {
+                               var values = jQuery.makeArray(val);
+
+                               jQuery( "option", this ).each(function() {
+                                       this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+                               });
+
+                               if ( !values.length ) {
+                                       this.selectedIndex = -1;
+                               }
+
+                       } else {
+                               this.value = val;
+                       }
+               });
+       }
+});
+
+jQuery.extend({
+       attrFn: {
+               val: true,
+               css: true,
+               html: true,
+               text: true,
+               data: true,
+               width: true,
+               height: true,
+               offset: true
+       },
+               
+       attr: function( elem, name, value, pass ) {
+               // don't set attributes on text and comment nodes
+               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
+                       return undefined;
+               }
+
+               if ( pass && name in jQuery.attrFn ) {
+                       return jQuery(elem)[name](value);
+               }
+
+               var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
+                       // Whether we are setting (or getting)
+                       set = value !== undefined;
+
+               // Try to normalize/fix the name
+               name = notxml && jQuery.props[ name ] || name;
+
+               // Only do all the following if this is a node (faster for style)
+               if ( elem.nodeType === 1 ) {
+                       // These attributes require special treatment
+                       var special = rspecialurl.test( name );
+
+                       // Safari mis-reports the default selected property of an option
+                       // Accessing the parent's selectedIndex property fixes it
+                       if ( name === "selected" && !jQuery.support.optSelected ) {
+                               var parent = elem.parentNode;
+                               if ( parent ) {
+                                       parent.selectedIndex;
+       
+                                       // Make sure that it also works with optgroups, see #5701
+                                       if ( parent.parentNode ) {
+                                               parent.parentNode.selectedIndex;
+                                       }
+                               }
+                       }
+
+                       // If applicable, access the attribute via the DOM 0 way
+                       if ( name in elem && notxml && !special ) {
+                               if ( set ) {
+                                       // We can't allow the type property to be changed (since it causes problems in IE)
+                                       if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
+                                               jQuery.error( "type property can't be changed" );
+                                       }
+
+                                       elem[ name ] = value;
+                               }
+
+                               // browsers index elements by id/name on forms, give priority to attributes.
+                               if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
+                                       return elem.getAttributeNode( name ).nodeValue;
+                               }
+
+                               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+                               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+                               if ( name === "tabIndex" ) {
+                                       var attributeNode = elem.getAttributeNode( "tabIndex" );
+
+                                       return attributeNode && attributeNode.specified ?
+                                               attributeNode.value :
+                                               rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+                                                       0 :
+                                                       undefined;
+                               }
+
+                               return elem[ name ];
+                       }
+
+                       if ( !jQuery.support.style && notxml && name === "style" ) {
+                               if ( set ) {
+                                       elem.style.cssText = "" + value;
+                               }
+
+                               return elem.style.cssText;
+                       }
+
+                       if ( set ) {
+                               // convert the value to a string (all browsers do this but IE) see #1070
+                               elem.setAttribute( name, "" + value );
+                       }
+
+                       var attr = !jQuery.support.hrefNormalized && notxml && special ?
+                                       // Some attributes require a special call on IE
+                                       elem.getAttribute( name, 2 ) :
+                                       elem.getAttribute( name );
+
+                       // Non-existent attributes return null, we normalize to undefined
+                       return attr === null ? undefined : attr;
+               }
+
+               // elem is actually elem.style ... set the style
+               // Using attr for specific style information is now deprecated. Use style instead.
+               return jQuery.style( elem, name, value );
+       }
+});
+var rnamespaces = /\.(.*)$/,
+       fcleanup = function( nm ) {
+               return nm.replace(/[^\w\s\.\|`]/g, function( ch ) {
+                       return "\\" + ch;
+               });
+       };
+
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+       // Bind an event to an element
+       // Original by Dean Edwards
+       add: function( elem, types, handler, data ) {
+               if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+                       return;
+               }
+
+               // For whatever reason, IE has trouble passing the window object
+               // around, causing it to be cloned in the process
+               if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {
+                       elem = window;
+               }
+
+               var handleObjIn, handleObj;
+
+               if ( handler.handler ) {
+                       handleObjIn = handler;
+                       handler = handleObjIn.handler;
+               }
+
+               // Make sure that the function being executed has a unique ID
+               if ( !handler.guid ) {
+                       handler.guid = jQuery.guid++;
+               }
+
+               // Init the element's event structure
+               var elemData = jQuery.data( elem );
+
+               // If no elemData is found then we must be trying to bind to one of the
+               // banned noData elements
+               if ( !elemData ) {
+                       return;
+               }
+
+               var events = elemData.events = elemData.events || {},
+                       eventHandle = elemData.handle, eventHandle;
+
+               if ( !eventHandle ) {
+                       elemData.handle = eventHandle = function() {
+                               // Handle the second event of a trigger and when
+                               // an event is called after a page has unloaded
+                               return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
+                                       jQuery.event.handle.apply( eventHandle.elem, arguments ) :
+                                       undefined;
+                       };
+               }
+
+               // Add elem as a property of the handle function
+               // This is to prevent a memory leak with non-native events in IE.
+               eventHandle.elem = elem;
+
+               // Handle multiple events separated by a space
+               // jQuery(...).bind("mouseover mouseout", fn);
+               types = types.split(" ");
+
+               var type, i = 0, namespaces;
+
+               while ( (type = types[ i++ ]) ) {
+                       handleObj = handleObjIn ?
+                               jQuery.extend({}, handleObjIn) :
+                               { handler: handler, data: data };
+
+                       // Namespaced event handlers
+                       if ( type.indexOf(".") > -1 ) {
+                               namespaces = type.split(".");
+                               type = namespaces.shift();
+                               handleObj.namespace = namespaces.slice(0).sort().join(".");
+
+                       } else {
+                               namespaces = [];
+                               handleObj.namespace = "";
+                       }
+
+                       handleObj.type = type;
+                       handleObj.guid = handler.guid;
+
+                       // Get the current list of functions bound to this event
+                       var handlers = events[ type ],
+                               special = jQuery.event.special[ type ] || {};
+
+                       // Init the event handler queue
+                       if ( !handlers ) {
+                               handlers = events[ type ] = [];
+
+                               // Check for a special event handler
+                               // Only use addEventListener/attachEvent if the special
+                               // events handler returns false
+                               if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+                                       // Bind the global event handler to the element
+                                       if ( elem.addEventListener ) {
+                                               elem.addEventListener( type, eventHandle, false );
+
+                                       } else if ( elem.attachEvent ) {
+                                               elem.attachEvent( "on" + type, eventHandle );
+                                       }
+                               }
+                       }
+                       
+                       if ( special.add ) { 
+                               special.add.call( elem, handleObj ); 
+
+                               if ( !handleObj.handler.guid ) {
+                                       handleObj.handler.guid = handler.guid;
+                               }
+                       }
+
+                       // Add the function to the element's handler list
+                       handlers.push( handleObj );
+
+                       // Keep track of which events have been used, for global triggering
+                       jQuery.event.global[ type ] = true;
+               }
+
+               // Nullify elem to prevent memory leaks in IE
+               elem = null;
+       },
+
+       global: {},
+
+       // Detach an event or set of events from an element
+       remove: function( elem, types, handler, pos ) {
+               // don't do events on text and comment nodes
+               if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+                       return;
+               }
+
+               var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+                       elemData = jQuery.data( elem ),
+                       events = elemData && elemData.events;
+
+               if ( !elemData || !events ) {
+                       return;
+               }
+
+               // types is actually an event object here
+               if ( types && types.type ) {
+                       handler = types.handler;
+                       types = types.type;
+               }
+
+               // Unbind all events for the element
+               if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+                       types = types || "";
+
+                       for ( type in events ) {
+                               jQuery.event.remove( elem, type + types );
+                       }
+
+                       return;
+               }
+
+               // Handle multiple events separated by a space
+               // jQuery(...).unbind("mouseover mouseout", fn);
+               types = types.split(" ");
+
+               while ( (type = types[ i++ ]) ) {
+                       origType = type;
+                       handleObj = null;
+                       all = type.indexOf(".") < 0;
+                       namespaces = [];
+
+                       if ( !all ) {
+                               // Namespaced event handlers
+                               namespaces = type.split(".");
+                               type = namespaces.shift();
+
+                               namespace = new RegExp("(^|\\.)" + 
+                                       jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)")
+                       }
+
+                       eventType = events[ type ];
+
+                       if ( !eventType ) {
+                               continue;
+                       }
+
+                       if ( !handler ) {
+                               for ( var j = 0; j < eventType.length; j++ ) {
+                                       handleObj = eventType[ j ];
+
+                                       if ( all || namespace.test( handleObj.namespace ) ) {
+                                               jQuery.event.remove( elem, origType, handleObj.handler, j );
+                                               eventType.splice( j--, 1 );
+                                       }
+                               }
+
+                               continue;
+                       }
+
+                       special = jQuery.event.special[ type ] || {};
+
+                       for ( var j = pos || 0; j < eventType.length; j++ ) {
+                               handleObj = eventType[ j ];
+
+                               if ( handler.guid === handleObj.guid ) {
+                                       // remove the given handler for the given type
+                                       if ( all || namespace.test( handleObj.namespace ) ) {
+                                               if ( pos == null ) {
+                                                       eventType.splice( j--, 1 );
+                                               }
+
+                                               if ( special.remove ) {
+                                                       special.remove.call( elem, handleObj );
+                                               }
+                                       }
+
+                                       if ( pos != null ) {
+                                               break;
+                                       }
+                               }
+                       }
+
+                       // remove generic event handler if no more handlers exist
+                       if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+                               if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+                                       removeEvent( elem, type, elemData.handle );
+                               }
+
+                               ret = null;
+                               delete events[ type ];
+                       }
+               }
+
+               // Remove the expando if it's no longer used
+               if ( jQuery.isEmptyObject( events ) ) {
+                       var handle = elemData.handle;
+                       if ( handle ) {
+                               handle.elem = null;
+                       }
+
+                       delete elemData.events;
+                       delete elemData.handle;
+
+                       if ( jQuery.isEmptyObject( elemData ) ) {
+                               jQuery.removeData( elem );
+                       }
+               }
+       },
+
+       // bubbling is internal
+       trigger: function( event, data, elem /*, bubbling */ ) {
+               // Event object or event type
+               var type = event.type || event,
+                       bubbling = arguments[3];
+
+               if ( !bubbling ) {
+                       event = typeof event === "object" ?
+                               // jQuery.Event object
+                               event[expando] ? event :
+                               // Object literal
+                               jQuery.extend( jQuery.Event(type), event ) :
+                               // Just the event type (string)
+                               jQuery.Event(type);
+
+                       if ( type.indexOf("!") >= 0 ) {
+                               event.type = type = type.slice(0, -1);
+                               event.exclusive = true;
+                       }
+
+                       // Handle a global trigger
+                       if ( !elem ) {
+                               // Don't bubble custom events when global (to avoid too much overhead)
+                               event.stopPropagation();
+
+                               // Only trigger if we've ever bound an event for it
+                               if ( jQuery.event.global[ type ] ) {
+                                       jQuery.each( jQuery.cache, function() {
+                                               if ( this.events && this.events[type] ) {
+                                                       jQuery.event.trigger( event, data, this.handle.elem );
+                                               }
+                                       });
+                               }
+                       }
+
+                       // Handle triggering a single element
+
+                       // don't do events on text and comment nodes
+                       if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
+                               return undefined;
+                       }
+
+                       // Clean up in case it is reused
+                       event.result = undefined;
+                       event.target = elem;
+
+                       // Clone the incoming data, if any
+                       data = jQuery.makeArray( data );
+                       data.unshift( event );
+               }
+
+               event.currentTarget = elem;
+
+               // Trigger the event, it is assumed that "handle" is a function
+               var handle = jQuery.data( elem, "handle" );
+               if ( handle ) {
+                       handle.apply( elem, data );
+               }
+
+               var parent = elem.parentNode || elem.ownerDocument;
+
+               // Trigger an inline bound script
+               try {
+                       if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
+                               if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
+                                       event.result = false;
+                               }
+                       }
+
+               // prevent IE from throwing an error for some elements with some event types, see #3533
+               } catch (e) {}
+
+               if ( !event.isPropagationStopped() && parent ) {
+                       jQuery.event.trigger( event, data, parent, true );
+
+               } else if ( !event.isDefaultPrevented() ) {
+                       var target = event.target, old,
+                               isClick = jQuery.nodeName(target, "a") && type === "click",
+                               special = jQuery.event.special[ type ] || {};
+
+                       if ( (!special._default || special._default.call( elem, event ) === false) && 
+                               !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
+
+                               try {
+                                       if ( target[ type ] ) {
+                                               // Make sure that we don't accidentally re-trigger the onFOO events
+                                               old = target[ "on" + type ];
+
+                                               if ( old ) {
+                                                       target[ "on" + type ] = null;
+                                               }
+
+                                               jQuery.event.triggered = true;
+                                               target[ type ]();
+                                       }
+
+                               // prevent IE from throwing an error for some elements with some event types, see #3533
+                               } catch (e) {}
+
+                               if ( old ) {
+                                       target[ "on" + type ] = old;
+                               }
+
+                               jQuery.event.triggered = false;
+                       }
+               }
+       },
+
+       handle: function( event ) {
+               var all, handlers, namespaces, namespace, events;
+
+               event = arguments[0] = jQuery.event.fix( event || window.event );
+               event.currentTarget = this;
+
+               // Namespaced event handlers
+               all = event.type.indexOf(".") < 0 && !event.exclusive;
+
+               if ( !all ) {
+                       namespaces = event.type.split(".");
+                       event.type = namespaces.shift();
+                       namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)");
+               }
+
+               var events = jQuery.data(this, "events"), handlers = events[ event.type ];
+
+               if ( events && handlers ) {
+                       // Clone the handlers to prevent manipulation
+                       handlers = handlers.slice(0);
+
+                       for ( var j = 0, l = handlers.length; j < l; j++ ) {
+                               var handleObj = handlers[ j ];
+
+                               // Filter the functions by class
+                               if ( all || namespace.test( handleObj.namespace ) ) {
+                                       // Pass in a reference to the handler function itself
+                                       // So that we can later remove it
+                                       event.handler = handleObj.handler;
+                                       event.data = handleObj.data;
+                                       event.handleObj = handleObj;
+       
+                                       var ret = handleObj.handler.apply( this, arguments );
+
+                                       if ( ret !== undefined ) {
+                                               event.result = ret;
+                                               if ( ret === false ) {
+                                                       event.preventDefault();
+                                                       event.stopPropagation();
+                                               }
+                                       }
+
+                                       if ( event.isImmediatePropagationStopped() ) {
+                                               break;
+                                       }
+                               }
+                       }
+               }
+
+               return event.result;
+       },
+
+       props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
+       fix: function( event ) {
+               if ( event[ expando ] ) {
+                       return event;
+               }
+
+               // store a copy of the original event object
+               // and "clone" to set read-only properties
+               var originalEvent = event;
+               event = jQuery.Event( originalEvent );
+
+               for ( var i = this.props.length, prop; i; ) {
+                       prop = this.props[ --i ];
+                       event[ prop ] = originalEvent[ prop ];
+               }
+
+               // Fix target property, if necessary
+               if ( !event.target ) {
+                       event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
+               }
+
+               // check if target is a textnode (safari)
+               if ( event.target.nodeType === 3 ) {
+                       event.target = event.target.parentNode;
+               }
+
+               // Add relatedTarget, if necessary
+               if ( !event.relatedTarget && event.fromElement ) {
+                       event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+               }
+
+               // Calculate pageX/Y if missing and clientX/Y available
+               if ( event.pageX == null && event.clientX != null ) {
+                       var doc = document.documentElement, body = document.body;
+                       event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+                       event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
+               }
+
+               // Add which for key events
+               if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) {
+                       event.which = event.charCode || event.keyCode;
+               }
+
+               // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+               if ( !event.metaKey && event.ctrlKey ) {
+                       event.metaKey = event.ctrlKey;
+               }
+
+               // Add which for click: 1 === left; 2 === middle; 3 === right
+               // Note: button is not normalized, so don't use it
+               if ( !event.which && event.button !== undefined ) {
+                       event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+               }
+
+               return event;
+       },
+
+       // Deprecated, use jQuery.guid instead
+       guid: 1E8,
+
+       // Deprecated, use jQuery.proxy instead
+       proxy: jQuery.proxy,
+
+       special: {
+               ready: {
+                       // Make sure the ready event is setup
+                       setup: jQuery.bindReady,
+                       teardown: jQuery.noop
+               },
+
+               live: {
+                       add: function( handleObj ) {
+                               jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); 
+                       },
+
+                       remove: function( handleObj ) {
+                               var remove = true,
+                                       type = handleObj.origType.replace(rnamespaces, "");
+                               
+                               jQuery.each( jQuery.data(this, "events").live || [], function() {
+                                       if ( type === this.origType.replace(rnamespaces, "") ) {
+                                               remove = false;
+                                               return false;
+                                       }
+                               });
+
+                               if ( remove ) {
+                                       jQuery.event.remove( this, handleObj.origType, liveHandler );
+                               }
+                       }
+
+               },
+
+               beforeunload: {
+                       setup: function( data, namespaces, eventHandle ) {
+                               // We only want to do this special case on windows
+                               if ( this.setInterval ) {
+                                       this.onbeforeunload = eventHandle;
+                               }
+
+                               return false;
+                       },
+                       teardown: function( namespaces, eventHandle ) {
+                               if ( this.onbeforeunload === eventHandle ) {
+                                       this.onbeforeunload = null;
+                               }
+                       }
+               }
+       }
+};
+
+var removeEvent = document.removeEventListener ?
+       function( elem, type, handle ) {
+               elem.removeEventListener( type, handle, false );
+       } : 
+       function( elem, type, handle ) {
+               elem.detachEvent( "on" + type, handle );
+       };
+
+jQuery.Event = function( src ) {
+       // Allow instantiation without the 'new' keyword
+       if ( !this.preventDefault ) {
+               return new jQuery.Event( src );
+       }
+
+       // Event object
+       if ( src && src.type ) {
+               this.originalEvent = src;
+               this.type = src.type;
+       // Event type
+       } else {
+               this.type = src;
+       }
+
+       // timeStamp is buggy for some events on Firefox(#3843)
+       // So we won't rely on the native value
+       this.timeStamp = now();
+
+       // Mark it as fixed
+       this[ expando ] = true;
+};
+
+function returnFalse() {
+       return false;
+}
+function returnTrue() {
+       return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+       preventDefault: function() {
+               this.isDefaultPrevented = returnTrue;
+
+               var e = this.originalEvent;
+               if ( !e ) {
+                       return;
+               }
+               
+               // if preventDefault exists run it on the original event
+               if ( e.preventDefault ) {
+                       e.preventDefault();
+               }
+               // otherwise set the returnValue property of the original event to false (IE)
+               e.returnValue = false;
+       },
+       stopPropagation: function() {
+               this.isPropagationStopped = returnTrue;
+
+               var e = this.originalEvent;
+               if ( !e ) {
+                       return;
+               }
+               // if stopPropagation exists run it on the original event
+               if ( e.stopPropagation ) {
+                       e.stopPropagation();
+               }
+               // otherwise set the cancelBubble property of the original event to true (IE)
+               e.cancelBubble = true;
+       },
+       stopImmediatePropagation: function() {
+               this.isImmediatePropagationStopped = returnTrue;
+               this.stopPropagation();
+       },
+       isDefaultPrevented: returnFalse,
+       isPropagationStopped: returnFalse,
+       isImmediatePropagationStopped: returnFalse
+};
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function( event ) {
+       // Check if mouse(over|out) are still within the same parent element
+       var parent = event.relatedTarget;
+
+       // Firefox sometimes assigns relatedTarget a XUL element
+       // which we cannot access the parentNode property of
+       try {
+               // Traverse up the tree
+               while ( parent && parent !== this ) {
+                       parent = parent.parentNode;
+               }
+
+               if ( parent !== this ) {
+                       // set the correct event type
+                       event.type = event.data;
+
+                       // handle event if we actually just moused on to a non sub-element
+                       jQuery.event.handle.apply( this, arguments );
+               }
+
+       // assuming we've left the element since we most likely mousedover a xul element
+       } catch(e) { }
+},
+
+// In case of event delegation, we only need to rename the event.type,
+// liveHandler will take care of the rest.
+delegate = function( event ) {
+       event.type = event.data;
+       jQuery.event.handle.apply( this, arguments );
+};
+
+// Create mouseenter and mouseleave events
+jQuery.each({
+       mouseenter: "mouseover",
+       mouseleave: "mouseout"
+}, function( orig, fix ) {
+       jQuery.event.special[ orig ] = {
+               setup: function( data ) {
+                       jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+               },
+               teardown: function( data ) {
+                       jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
+               }
+       };
+});
+
+// submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+       jQuery.event.special.submit = {
+               setup: function( data, namespaces ) {
+                       if ( this.nodeName.toLowerCase() !== "form" ) {
+                               jQuery.event.add(this, "click.specialSubmit", function( e ) {
+                                       var elem = e.target, type = elem.type;
+
+                                       if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+                                               return trigger( "submit", this, arguments );
+                                       }
+                               });
+        
+                               jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+                                       var elem = e.target, type = elem.type;
+
+                                       if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+                                               return trigger( "submit", this, arguments );
+                                       }
+                               });
+
+                       } else {
+                               return false;
+                       }
+               },
+
+               teardown: function( namespaces ) {
+                       jQuery.event.remove( this, ".specialSubmit" );
+               }
+       };
+
+}
+
+// change delegation, happens here so we have bind.
+if ( !jQuery.support.changeBubbles ) {
+
+       var formElems = /textarea|input|select/i,
+
+       changeFilters,
+
+       getVal = function( elem ) {
+               var type = elem.type, val = elem.value;
+
+               if ( type === "radio" || type === "checkbox" ) {
+                       val = elem.checked;
+
+               } else if ( type === "select-multiple" ) {
+                       val = elem.selectedIndex > -1 ?
+                               jQuery.map( elem.options, function( elem ) {
+                                       return elem.selected;
+                               }).join("-") :
+                               "";
+
+               } else if ( elem.nodeName.toLowerCase() === "select" ) {
+                       val = elem.selectedIndex;
+               }
+
+               return val;
+       },
+
+       testChange = function testChange( e ) {
+               var elem = e.target, data, val;
+
+               if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {
+                       return;
+               }
+
+               data = jQuery.data( elem, "_change_data" );
+               val = getVal(elem);
+
+               // the current data will be also retrieved by beforeactivate
+               if ( e.type !== "focusout" || elem.type !== "radio" ) {
+                       jQuery.data( elem, "_change_data", val );
+               }
+               
+               if ( data === undefined || val === data ) {
+                       return;
+               }
+
+               if ( data != null || val ) {
+                       e.type = "change";
+                       return jQuery.event.trigger( e, arguments[1], elem );
+               }
+       };
+
+       jQuery.event.special.change = {
+               filters: {
+                       focusout: testChange, 
+
+                       click: function( e ) {
+                               var elem = e.target, type = elem.type;
+
+                               if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
+                                       return testChange.call( this, e );
+                               }
+                       },
+
+                       // Change has to be called before submit
+                       // Keydown will be called before keypress, which is used in submit-event delegation
+                       keydown: function( e ) {
+                               var elem = e.target, type = elem.type;
+
+                               if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
+                                       (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+                                       type === "select-multiple" ) {
+                                       return testChange.call( this, e );
+                               }
+                       },
+
+                       // Beforeactivate happens also before the previous element is blurred
+                       // with this event you can't trigger a change event, but you can store
+                       // information/focus[in] is not needed anymore
+                       beforeactivate: function( e ) {
+                               var elem = e.target;
+                               jQuery.data( elem, "_change_data", getVal(elem) );
+                       }
+               },
+
+               setup: function( data, namespaces ) {
+                       if ( this.type === "file" ) {
+                               return false;
+                       }
+
+                       for ( var type in changeFilters ) {
+                               jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
+                       }
+
+                       return formElems.test( this.nodeName );
+               },
+
+               teardown: function( namespaces ) {
+                       jQuery.event.remove( this, ".specialChange" );
+
+                       return formElems.test( this.nodeName );
+               }
+       };
+
+       changeFilters = jQuery.event.special.change.filters;
+}
+
+function trigger( type, elem, args ) {
+       args[0].type = type;
+       return jQuery.event.handle.apply( elem, args );
+}
+
+// Create "bubbling" focus and blur events
+if ( document.addEventListener ) {
+       jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+               jQuery.event.special[ fix ] = {
+                       setup: function() {
+                               this.addEventListener( orig, handler, true );
+                       }, 
+                       teardown: function() { 
+                               this.removeEventListener( orig, handler, true );
+                       }
+               };
+
+               function handler( e ) { 
+                       e = jQuery.event.fix( e );
+                       e.type = fix;
+                       return jQuery.event.handle.call( this, e );
+               }
+       });
+}
+
+jQuery.each(["bind", "one"], function( i, name ) {
+       jQuery.fn[ name ] = function( type, data, fn ) {
+               // Handle object literals
+               if ( typeof type === "object" ) {
+                       for ( var key in type ) {
+                               this[ name ](key, data, type[key], fn);
+                       }
+                       return this;
+               }
+               
+               if ( jQuery.isFunction( data ) ) {
+                       fn = data;
+                       data = undefined;
+               }
+
+               var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
+                       jQuery( this ).unbind( event, handler );
+                       return fn.apply( this, arguments );
+               }) : fn;
+
+               if ( type === "unload" && name !== "one" ) {
+                       this.one( type, data, fn );
+
+               } else {
+                       for ( var i = 0, l = this.length; i < l; i++ ) {
+                               jQuery.event.add( this[i], type, handler, data );
+                       }
+               }
+
+               return this;
+       };
+});
+
+jQuery.fn.extend({
+       unbind: function( type, fn ) {
+               // Handle object literals
+               if ( typeof type === "object" && !type.preventDefault ) {
+                       for ( var key in type ) {
+                               this.unbind(key, type[key]);
+                       }
+
+               } else {
+                       for ( var i = 0, l = this.length; i < l; i++ ) {
+                               jQuery.event.remove( this[i], type, fn );
+                       }
+               }
+
+               return this;
+       },
+       
+       delegate: function( selector, types, data, fn ) {
+               return this.live( types, data, fn, selector );
+       },
+       
+       undelegate: function( selector, types, fn ) {
+               if ( arguments.length === 0 ) {
+                               return this.unbind( "live" );
+               
+               } else {
+                       return this.die( types, null, fn, selector );
+               }
+       },
+       
+       trigger: function( type, data ) {
+               return this.each(function() {
+                       jQuery.event.trigger( type, data, this );
+               });
+       },
+
+       triggerHandler: function( type, data ) {
+               if ( this[0] ) {
+                       var event = jQuery.Event( type );
+                       event.preventDefault();
+                       event.stopPropagation();
+                       jQuery.event.trigger( event, data, this[0] );
+                       return event.result;
+               }
+       },
+
+       toggle: function( fn ) {
+               // Save reference to arguments for access in closure
+               var args = arguments, i = 1;
+
+               // link all the functions, so any of them can unbind this click handler
+               while ( i < args.length ) {
+                       jQuery.proxy( fn, args[ i++ ] );
+               }
+
+               return this.click( jQuery.proxy( fn, function( event ) {
+                       // Figure out which function to execute
+                       var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+                       jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+                       // Make sure that clicks stop
+                       event.preventDefault();
+
+                       // and execute the function
+                       return args[ lastToggle ].apply( this, arguments ) || false;
+               }));
+       },
+
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+       }
+});
+
+var liveMap = {
+       focus: "focusin",
+       blur: "focusout",
+       mouseenter: "mouseover",
+       mouseleave: "mouseout"
+};
+
+jQuery.each(["live", "die"], function( i, name ) {
+       jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+               var type, i = 0, match, namespaces, preType,
+                       selector = origSelector || this.selector,
+                       context = origSelector ? this : jQuery( this.context );
+
+               if ( jQuery.isFunction( data ) ) {
+                       fn = data;
+                       data = undefined;
+               }
+
+               types = (types || "").split(" ");
+
+               while ( (type = types[ i++ ]) != null ) {
+                       match = rnamespaces.exec( type );
+                       namespaces = "";
+
+                       if ( match )  {
+                               namespaces = match[0];
+                               type = type.replace( rnamespaces, "" );
+                       }
+
+                       if ( type === "hover" ) {
+                               types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+                               continue;
+                       }
+
+                       preType = type;
+
+                       if ( type === "focus" || type === "blur" ) {
+                               types.push( liveMap[ type ] + namespaces );
+                               type = type + namespaces;
+
+                       } else {
+                               type = (liveMap[ type ] || type) + namespaces;
+                       }
+
+                       if ( name === "live" ) {
+                               // bind live handler
+                               context.each(function(){
+                                       jQuery.event.add( this, liveConvert( type, selector ),
+                                               { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
+                               });
+
+                       } else {
+                               // unbind live handler
+                               context.unbind( liveConvert( type, selector ), fn );
+                       }
+               }
+               
+               return this;
+       }
+});
+
+function liveHandler( event ) {
+       var stop, elems = [], selectors = [], args = arguments,
+               related, match, handleObj, elem, j, i, l, data,
+               events = jQuery.data( this, "events" );
+
+       // Make sure we avoid non-left-click bubbling in Firefox (#3861)
+       if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
+               return;
+       }
+
+       event.liveFired = this;
+
+       var live = events.live.slice(0);
+
+       for ( j = 0; j < live.length; j++ ) {
+               handleObj = live[j];
+
+               if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+                       selectors.push( handleObj.selector );
+
+               } else {
+                       live.splice( j--, 1 );
+               }
+       }
+
+       match = jQuery( event.target ).closest( selectors, event.currentTarget );
+
+       for ( i = 0, l = match.length; i < l; i++ ) {
+               for ( j = 0; j < live.length; j++ ) {
+                       handleObj = live[j];
+
+                       if ( match[i].selector === handleObj.selector ) {
+                               elem = match[i].elem;
+                               related = null;
+
+                               // Those two events require additional checking
+                               if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+                                       related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
+                               }
+
+                               if ( !related || related !== elem ) {
+                                       elems.push({ elem: elem, handleObj: handleObj });
+                               }
+                       }
+               }
+       }
+
+       for ( i = 0, l = elems.length; i < l; i++ ) {
+               match = elems[i];
+               event.currentTarget = match.elem;
+               event.data = match.handleObj.data;
+               event.handleObj = match.handleObj;
+
+               if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) {
+                       stop = false;
+                       break;
+               }
+       }
+
+       return stop;
+}
+
+function liveConvert( type, selector ) {
+       return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&");
+}
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+       "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
+
+       // Handle event binding
+       jQuery.fn[ name ] = function( fn ) {
+               return fn ? this.bind( name, fn ) : this.trigger( name );
+       };
+
+       if ( jQuery.attrFn ) {
+               jQuery.attrFn[ name ] = true;
+       }
+});
+
+// Prevent memory leaks in IE
+// Window isn't included so as not to unbind existing unload events
+// More info:
+//  - http://isaacschlueter.com/2006/10/msie-memory-leaks/
+if ( window.attachEvent && !window.addEventListener ) {
+       window.attachEvent("onunload", function() {
+               for ( var id in jQuery.cache ) {
+                       if ( jQuery.cache[ id ].handle ) {
+                               // Try/Catch is to handle iframes being unloaded, see #4280
+                               try {
+                                       jQuery.event.remove( jQuery.cache[ id ].handle.elem );
+                               } catch(e) {}
+                       }
+               }
+       });
+}
+/*!
+ * Sizzle CSS Selector Engine - v1.0
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+       done = 0,
+       toString = Object.prototype.toString,
+       hasDuplicate = false,
+       baseHasDuplicate = true;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function(){
+       baseHasDuplicate = false;
+       return 0;
+});
+
+var Sizzle = function(selector, context, results, seed) {
+       results = results || [];
+       var origContext = context = context || document;
+
+       if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+               return [];
+       }
+       
+       if ( !selector || typeof selector !== "string" ) {
+               return results;
+       }
+
+       var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),
+               soFar = selector;
+       
+       // Reset the position of the chunker regexp (start from head)
+       while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
+               soFar = m[3];
+               
+               parts.push( m[1] );
+               
+               if ( m[2] ) {
+                       extra = m[3];
+                       break;
+               }
+       }
+
+       if ( parts.length > 1 && origPOS.exec( selector ) ) {
+               if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+                       set = posProcess( parts[0] + parts[1], context );
+               } else {
+                       set = Expr.relative[ parts[0] ] ?
+                               [ context ] :
+                               Sizzle( parts.shift(), context );
+
+                       while ( parts.length ) {
+                               selector = parts.shift();
+
+                               if ( Expr.relative[ selector ] ) {
+                                       selector += parts.shift();
+                               }
+                               
+                               set = posProcess( selector, set );
+                       }
+               }
+       } else {
+               // Take a shortcut and set the context if the root selector is an ID
+               // (but not if it'll be faster if the inner selector is an ID)
+               if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+                               Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+                       var ret = Sizzle.find( parts.shift(), context, contextXML );
+                       context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
+               }
+
+               if ( context ) {
+                       var ret = seed ?
+                               { expr: parts.pop(), set: makeArray(seed) } :
+                               Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+                       set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
+
+                       if ( parts.length > 0 ) {
+                               checkSet = makeArray(set);
+                       } else {
+                               prune = false;
+                       }
+
+                       while ( parts.length ) {
+                               var cur = parts.pop(), pop = cur;
+
+                               if ( !Expr.relative[ cur ] ) {
+                                       cur = "";
+                               } else {
+                                       pop = parts.pop();
+                               }
+
+                               if ( pop == null ) {
+                                       pop = context;
+                               }
+
+                               Expr.relative[ cur ]( checkSet, pop, contextXML );
+                       }
+               } else {
+                       checkSet = parts = [];
+               }
+       }
+
+       if ( !checkSet ) {
+               checkSet = set;
+       }
+
+       if ( !checkSet ) {
+               Sizzle.error( cur || selector );
+       }
+
+       if ( toString.call(checkSet) === "[object Array]" ) {
+               if ( !prune ) {
+                       results.push.apply( results, checkSet );
+               } else if ( context && context.nodeType === 1 ) {
+                       for ( var i = 0; checkSet[i] != null; i++ ) {
+                               if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
+                                       results.push( set[i] );
+                               }
+                       }
+               } else {
+                       for ( var i = 0; checkSet[i] != null; i++ ) {
+                               if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+                                       results.push( set[i] );
+                               }
+                       }
+               }
+       } else {
+               makeArray( checkSet, results );
+       }
+
+       if ( extra ) {
+               Sizzle( extra, origContext, results, seed );
+               Sizzle.uniqueSort( results );
+       }
+
+       return results;
+};
+
+Sizzle.uniqueSort = function(results){
+       if ( sortOrder ) {
+               hasDuplicate = baseHasDuplicate;
+               results.sort(sortOrder);
+
+               if ( hasDuplicate ) {
+                       for ( var i = 1; i < results.length; i++ ) {
+                               if ( results[i] === results[i-1] ) {
+                                       results.splice(i--, 1);
+                               }
+                       }
+               }
+       }
+
+       return results;
+};
+
+Sizzle.matches = function(expr, set){
+       return Sizzle(expr, null, null, set);
+};
+
+Sizzle.find = function(expr, context, isXML){
+       var set, match;
+
+       if ( !expr ) {
+               return [];
+       }
+
+       for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+               var type = Expr.order[i], match;
+               
+               if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+                       var left = match[1];
+                       match.splice(1,1);
+
+                       if ( left.substr( left.length - 1 ) !== "\\" ) {
+                               match[1] = (match[1] || "").replace(/\\/g, "");
+                               set = Expr.find[ type ]( match, context, isXML );
+                               if ( set != null ) {
+                                       expr = expr.replace( Expr.match[ type ], "" );
+                                       break;
+                               }
+                       }
+               }
+       }
+
+       if ( !set ) {
+               set = context.getElementsByTagName("*");
+       }
+
+       return {set: set, expr: expr};
+};
+
+Sizzle.filter = function(expr, set, inplace, not){
+       var old = expr, result = [], curLoop = set, match, anyFound,
+               isXMLFilter = set && set[0] && isXML(set[0]);
+
+       while ( expr && set.length ) {
+               for ( var type in Expr.filter ) {
+                       if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+                               var filter = Expr.filter[ type ], found, item, left = match[1];
+                               anyFound = false;
+
+                               match.splice(1,1);
+
+                               if ( left.substr( left.length - 1 ) === "\\" ) {
+                                       continue;
+                               }
+
+                               if ( curLoop === result ) {
+                                       result = [];
+                               }
+
+                               if ( Expr.preFilter[ type ] ) {
+                                       match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+                                       if ( !match ) {
+                                               anyFound = found = true;
+                                       } else if ( match === true ) {
+                                               continue;
+                                       }
+                               }
+
+                               if ( match ) {
+                                       for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+                                               if ( item ) {
+                                                       found = filter( item, match, i, curLoop );
+                                                       var pass = not ^ !!found;
+
+                                                       if ( inplace && found != null ) {
+                                                               if ( pass ) {
+                                                                       anyFound = true;
+                                                               } else {
+                                                                       curLoop[i] = false;
+                                                               }
+                                                       } else if ( pass ) {
+                                                               result.push( item );
+                                                               anyFound = true;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               if ( found !== undefined ) {
+                                       if ( !inplace ) {
+                                               curLoop = result;
+                                       }
+
+                                       expr = expr.replace( Expr.match[ type ], "" );
+
+                                       if ( !anyFound ) {
+                                               return [];
+                                       }
+
+                                       break;
+                               }
+                       }
+               }
+
+               // Improper expression
+               if ( expr === old ) {
+                       if ( anyFound == null ) {
+                               Sizzle.error( expr );
+                       } else {
+                               break;
+                       }
+               }
+
+               old = expr;
+       }
+
+       return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+       throw "Syntax error, unrecognized expression: " + msg;
+};
+
+var Expr = Sizzle.selectors = {
+       order: [ "ID", "NAME", "TAG" ],
+       match: {
+               ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+               CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+               NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,
+               ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
+               TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
+               CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
+               POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
+               PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+       },
+       leftMatch: {},
+       attrMap: {
+               "class": "className",
+               "for": "htmlFor"
+       },
+       attrHandle: {
+               href: function(elem){
+                       return elem.getAttribute("href");
+               }
+       },
+       relative: {
+               "+": function(checkSet, part){
+                       var isPartStr = typeof part === "string",
+                               isTag = isPartStr && !/\W/.test(part),
+                               isPartStrNotTag = isPartStr && !isTag;
+
+                       if ( isTag ) {
+                               part = part.toLowerCase();
+                       }
+
+                       for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+                               if ( (elem = checkSet[i]) ) {
+                                       while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+                                       checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+                                               elem || false :
+                                               elem === part;
+                               }
+                       }
+
+                       if ( isPartStrNotTag ) {
+                               Sizzle.filter( part, checkSet, true );
+                       }
+               },
+               ">": function(checkSet, part){
+                       var isPartStr = typeof part === "string";
+
+                       if ( isPartStr && !/\W/.test(part) ) {
+                               part = part.toLowerCase();
+
+                               for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+                                       var elem = checkSet[i];
+                                       if ( elem ) {
+                                               var parent = elem.parentNode;
+                                               checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+                                       }
+                               }
+                       } else {
+                               for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+                                       var elem = checkSet[i];
+                                       if ( elem ) {
+                                               checkSet[i] = isPartStr ?
+                                                       elem.parentNode :
+                                                       elem.parentNode === part;
+                                       }
+                               }
+
+                               if ( isPartStr ) {
+                                       Sizzle.filter( part, checkSet, true );
+                               }
+                       }
+               },
+               "": function(checkSet, part, isXML){
+                       var doneName = done++, checkFn = dirCheck;
+
+                       if ( typeof part === "string" && !/\W/.test(part) ) {
+                               var nodeCheck = part = part.toLowerCase();
+                               checkFn = dirNodeCheck;
+                       }
+
+                       checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
+               },
+               "~": function(checkSet, part, isXML){
+                       var doneName = done++, checkFn = dirCheck;
+
+                       if ( typeof part === "string" && !/\W/.test(part) ) {
+                               var nodeCheck = part = part.toLowerCase();
+                               checkFn = dirNodeCheck;
+                       }
+
+                       checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
+               }
+       },
+       find: {
+               ID: function(match, context, isXML){
+                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
+                               var m = context.getElementById(match[1]);
+                               return m ? [m] : [];
+                       }
+               },
+               NAME: function(match, context){
+                       if ( typeof context.getElementsByName !== "undefined" ) {
+                               var ret = [], results = context.getElementsByName(match[1]);
+
+                               for ( var i = 0, l = results.length; i < l; i++ ) {
+                                       if ( results[i].getAttribute("name") === match[1] ) {
+                                               ret.push( results[i] );
+                                       }
+                               }
+
+                               return ret.length === 0 ? null : ret;
+                       }
+               },
+               TAG: function(match, context){
+                       return context.getElementsByTagName(match[1]);
+               }
+       },
+       preFilter: {
+               CLASS: function(match, curLoop, inplace, result, not, isXML){
+                       match = " " + match[1].replace(/\\/g, "") + " ";
+
+                       if ( isXML ) {
+                               return match;
+                       }
+
+                       for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+                               if ( elem ) {
+                                       if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {
+                                               if ( !inplace ) {
+                                                       result.push( elem );
+                                               }
+                                       } else if ( inplace ) {
+                                               curLoop[i] = false;
+                                       }
+                               }
+                       }
+
+                       return false;
+               },
+               ID: function(match){
+                       return match[1].replace(/\\/g, "");
+               },
+               TAG: function(match, curLoop){
+                       return match[1].toLowerCase();
+               },
+               CHILD: function(match){
+                       if ( match[1] === "nth" ) {
+                               // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+                               var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
+                                       match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+                                       !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+                               // calculate the numbers (first)n+(last) including if they are negative
+                               match[2] = (test[1] + (test[2] || 1)) - 0;
+                               match[3] = test[3] - 0;
+                       }
+
+                       // TODO: Move to normal caching system
+                       match[0] = done++;
+
+                       return match;
+               },
+               ATTR: function(match, curLoop, inplace, result, not, isXML){
+                       var name = match[1].replace(/\\/g, "");
+                       
+                       if ( !isXML && Expr.attrMap[name] ) {
+                               match[1] = Expr.attrMap[name];
+                       }
+
+                       if ( match[2] === "~=" ) {
+                               match[4] = " " + match[4] + " ";
+                       }
+
+                       return match;
+               },
+               PSEUDO: function(match, curLoop, inplace, result, not){
+                       if ( match[1] === "not" ) {
+                               // If we're dealing with a complex expression, or a simple one
+                               if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+                                       match[3] = Sizzle(match[3], null, null, curLoop);
+                               } else {
+                                       var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+                                       if ( !inplace ) {
+                                               result.push.apply( result, ret );
+                                       }
+                                       return false;
+                               }
+                       } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+                               return true;
+                       }
+                       
+                       return match;
+               },
+               POS: function(match){
+                       match.unshift( true );
+                       return match;
+               }
+       },
+       filters: {
+               enabled: function(elem){
+                       return elem.disabled === false && elem.type !== "hidden";
+               },
+               disabled: function(elem){
+                       return elem.disabled === true;
+               },
+               checked: function(elem){
+                       return elem.checked === true;
+               },
+               selected: function(elem){
+                       // Accessing this property makes selected-by-default
+                       // options in Safari work properly
+                       elem.parentNode.selectedIndex;
+                       return elem.selected === true;
+               },
+               parent: function(elem){
+                       return !!elem.firstChild;
+               },
+               empty: function(elem){
+                       return !elem.firstChild;
+               },
+               has: function(elem, i, match){
+                       return !!Sizzle( match[3], elem ).length;
+               },
+               header: function(elem){
+                       return /h\d/i.test( elem.nodeName );
+               },
+               text: function(elem){
+                       return "text" === elem.type;
+               },
+               radio: function(elem){
+                       return "radio" === elem.type;
+               },
+               checkbox: function(elem){
+                       return "checkbox" === elem.type;
+               },
+               file: function(elem){
+                       return "file" === elem.type;
+               },
+               password: function(elem){
+                       return "password" === elem.type;
+               },
+               submit: function(elem){
+                       return "submit" === elem.type;
+               },
+               image: function(elem){
+                       return "image" === elem.type;
+               },
+               reset: function(elem){
+                       return "reset" === elem.type;
+               },
+               button: function(elem){
+                       return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
+               },
+               input: function(elem){
+                       return /input|select|textarea|button/i.test(elem.nodeName);
+               }
+       },
+       setFilters: {
+               first: function(elem, i){
+                       return i === 0;
+               },
+               last: function(elem, i, match, array){
+                       return i === array.length - 1;
+               },
+               even: function(elem, i){
+                       return i % 2 === 0;
+               },
+               odd: function(elem, i){
+                       return i % 2 === 1;
+               },
+               lt: function(elem, i, match){
+                       return i < match[3] - 0;
+               },
+               gt: function(elem, i, match){
+                       return i > match[3] - 0;
+               },
+               nth: function(elem, i, match){
+                       return match[3] - 0 === i;
+               },
+               eq: function(elem, i, match){
+                       return match[3] - 0 === i;
+               }
+       },
+       filter: {
+               PSEUDO: function(elem, match, i, array){
+                       var name = match[1], filter = Expr.filters[ name ];
+
+                       if ( filter ) {
+                               return filter( elem, i, match, array );
+                       } else if ( name === "contains" ) {
+                               return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+                       } else if ( name === "not" ) {
+                               var not = match[3];
+
+                               for ( var i = 0, l = not.length; i < l; i++ ) {
+                                       if ( not[i] === elem ) {
+                                               return false;
+                                       }
+                               }
+
+                               return true;
+                       } else {
+                               Sizzle.error( "Syntax error, unrecognized expression: " + name );
+                       }
+               },
+               CHILD: function(elem, match){
+                       var type = match[1], node = elem;
+                       switch (type) {
+                               case 'only':
+                               case 'first':
+                                       while ( (node = node.previousSibling) )  {
+                                               if ( node.nodeType === 1 ) { 
+                                                       return false; 
+                                               }
+                                       }
+                                       if ( type === "first" ) { 
+                                               return true; 
+                                       }
+                                       node = elem;
+                               case 'last':
+                                       while ( (node = node.nextSibling) )      {
+                                               if ( node.nodeType === 1 ) { 
+                                                       return false; 
+                                               }
+                                       }
+                                       return true;
+                               case 'nth':
+                                       var first = match[2], last = match[3];
+
+                                       if ( first === 1 && last === 0 ) {
+                                               return true;
+                                       }
+                                       
+                                       var doneName = match[0],
+                                               parent = elem.parentNode;
+       
+                                       if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+                                               var count = 0;
+                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {
+                                                       if ( node.nodeType === 1 ) {
+                                                               node.nodeIndex = ++count;
+                                                       }
+                                               } 
+                                               parent.sizcache = doneName;
+                                       }
+                                       
+                                       var diff = elem.nodeIndex - last;
+                                       if ( first === 0 ) {
+                                               return diff === 0;
+                                       } else {
+                                               return ( diff % first === 0 && diff / first >= 0 );
+                                       }
+                       }
+               },
+               ID: function(elem, match){
+                       return elem.nodeType === 1 && elem.getAttribute("id") === match;
+               },
+               TAG: function(elem, match){
+                       return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
+               },
+               CLASS: function(elem, match){
+                       return (" " + (elem.className || elem.getAttribute("class")) + " ")
+                               .indexOf( match ) > -1;
+               },
+               ATTR: function(elem, match){
+                       var name = match[1],
+                               result = Expr.attrHandle[ name ] ?
+                                       Expr.attrHandle[ name ]( elem ) :
+                                       elem[ name ] != null ?
+                                               elem[ name ] :
+                                               elem.getAttribute( name ),
+                               value = result + "",
+                               type = match[2],
+                               check = match[4];
+
+                       return result == null ?
+                               type === "!=" :
+                               type === "=" ?
+                               value === check :
+                               type === "*=" ?
+                               value.indexOf(check) >= 0 :
+                               type === "~=" ?
+                               (" " + value + " ").indexOf(check) >= 0 :
+                               !check ?
+                               value && result !== false :
+                               type === "!=" ?
+                               value !== check :
+                               type === "^=" ?
+                               value.indexOf(check) === 0 :
+                               type === "$=" ?
+                               value.substr(value.length - check.length) === check :
+                               type === "|=" ?
+                               value === check || value.substr(0, check.length + 1) === check + "-" :
+                               false;
+               },
+               POS: function(elem, match, i, array){
+                       var name = match[2], filter = Expr.setFilters[ name ];
+
+                       if ( filter ) {
+                               return filter( elem, i, match, array );
+                       }
+               }
+       }
+};
+
+var origPOS = Expr.match.POS;
+
+for ( var type in Expr.match ) {
+       Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
+       Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){
+               return "\\" + (num - 0 + 1);
+       }));
+}
+
+var makeArray = function(array, results) {
+       array = Array.prototype.slice.call( array, 0 );
+
+       if ( results ) {
+               results.push.apply( results, array );
+               return results;
+       }
+       
+       return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+       Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch(e){
+       makeArray = function(array, results) {
+               var ret = results || [];
+
+               if ( toString.call(array) === "[object Array]" ) {
+                       Array.prototype.push.apply( ret, array );
+               } else {
+                       if ( typeof array.length === "number" ) {
+                               for ( var i = 0, l = array.length; i < l; i++ ) {
+                                       ret.push( array[i] );
+                               }
+                       } else {
+                               for ( var i = 0; array[i]; i++ ) {
+                                       ret.push( array[i] );
+                               }
+                       }
+               }
+
+               return ret;
+       };
+}
+
+var sortOrder;
+
+if ( document.documentElement.compareDocumentPosition ) {
+       sortOrder = function( a, b ) {
+               if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+                       if ( a == b ) {
+                               hasDuplicate = true;
+                       }
+                       return a.compareDocumentPosition ? -1 : 1;
+               }
+
+               var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
+               if ( ret === 0 ) {
+                       hasDuplicate = true;
+               }
+               return ret;
+       };
+} else if ( "sourceIndex" in document.documentElement ) {
+       sortOrder = function( a, b ) {
+               if ( !a.sourceIndex || !b.sourceIndex ) {
+                       if ( a == b ) {
+                               hasDuplicate = true;
+                       }
+                       return a.sourceIndex ? -1 : 1;
+               }
+
+               var ret = a.sourceIndex - b.sourceIndex;
+               if ( ret === 0 ) {
+                       hasDuplicate = true;
+               }
+               return ret;
+       };
+} else if ( document.createRange ) {
+       sortOrder = function( a, b ) {
+               if ( !a.ownerDocument || !b.ownerDocument ) {
+                       if ( a == b ) {
+                               hasDuplicate = true;
+                       }
+                       return a.ownerDocument ? -1 : 1;
+               }
+
+               var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
+               aRange.setStart(a, 0);
+               aRange.setEnd(a, 0);
+               bRange.setStart(b, 0);
+               bRange.setEnd(b, 0);
+               var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
+               if ( ret === 0 ) {
+                       hasDuplicate = true;
+               }
+               return ret;
+       };
+}
+
+// Utility function for retreiving the text value of an array of DOM nodes
+function getText( elems ) {
+       var ret = "", elem;
+
+       for ( var i = 0; elems[i]; i++ ) {
+               elem = elems[i];
+
+               // Get the text from text nodes and CDATA nodes
+               if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+                       ret += elem.nodeValue;
+
+               // Traverse everything else, except comment nodes
+               } else if ( elem.nodeType !== 8 ) {
+                       ret += getText( elem.childNodes );
+               }
+       }
+
+       return ret;
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+       // We're going to inject a fake input element with a specified name
+       var form = document.createElement("div"),
+               id = "script" + (new Date).getTime();
+       form.innerHTML = "<a name='" + id + "'/>";
+
+       // Inject it into the root element, check its status, and remove it quickly
+       var root = document.documentElement;
+       root.insertBefore( form, root.firstChild );
+
+       // The workaround has to do additional checks after a getElementById
+       // Which slows things down for other browsers (hence the branching)
+       if ( document.getElementById( id ) ) {
+               Expr.find.ID = function(match, context, isXML){
+                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
+                               var m = context.getElementById(match[1]);
+                               return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
+                       }
+               };
+
+               Expr.filter.ID = function(elem, match){
+                       var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+                       return elem.nodeType === 1 && node && node.nodeValue === match;
+               };
+       }
+
+       root.removeChild( form );
+       root = form = null; // release memory in IE
+})();
+
+(function(){
+       // Check to see if the browser returns only elements
+       // when doing getElementsByTagName("*")
+
+       // Create a fake element
+       var div = document.createElement("div");
+       div.appendChild( document.createComment("") );
+
+       // Make sure no comments are found
+       if ( div.getElementsByTagName("*").length > 0 ) {
+               Expr.find.TAG = function(match, context){
+                       var results = context.getElementsByTagName(match[1]);
+
+                       // Filter out possible comments
+                       if ( match[1] === "*" ) {
+                               var tmp = [];
+
+                               for ( var i = 0; results[i]; i++ ) {
+                                       if ( results[i].nodeType === 1 ) {
+                                               tmp.push( results[i] );
+                                       }
+                               }
+
+                               results = tmp;
+                       }
+
+                       return results;
+               };
+       }
+
+       // Check to see if an attribute returns normalized href attributes
+       div.innerHTML = "<a href='#'></a>";
+       if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+                       div.firstChild.getAttribute("href") !== "#" ) {
+               Expr.attrHandle.href = function(elem){
+                       return elem.getAttribute("href", 2);
+               };
+       }
+
+       div = null; // release memory in IE
+})();
+
+if ( document.querySelectorAll ) {
+       (function(){
+               var oldSizzle = Sizzle, div = document.createElement("div");
+               div.innerHTML = "<p class='TEST'></p>";
+
+               // Safari can't handle uppercase or unicode characters when
+               // in quirks mode.
+               if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+                       return;
+               }
+       
+               Sizzle = function(query, context, extra, seed){
+                       context = context || document;
+
+                       // Only use querySelectorAll on non-XML documents
+                       // (ID selectors don't work in non-HTML documents)
+                       if ( !seed && context.nodeType === 9 && !isXML(context) ) {
+                               try {
+                                       return makeArray( context.querySelectorAll(query), extra );
+                               } catch(e){}
+                       }
+               
+                       return oldSizzle(query, context, extra, seed);
+               };
+
+               for ( var prop in oldSizzle ) {
+                       Sizzle[ prop ] = oldSizzle[ prop ];
+               }
+
+               div = null; // release memory in IE
+       })();
+}
+
+(function(){
+       var div = document.createElement("div");
+
+       div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+       // Opera can't find a second classname (in 9.6)
+       // Also, make sure that getElementsByClassName actually exists
+       if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+               return;
+       }
+
+       // Safari caches class attributes, doesn't catch changes (in 3.2)
+       div.lastChild.className = "e";
+
+       if ( div.getElementsByClassName("e").length === 1 ) {
+               return;
+       }
+       
+       Expr.order.splice(1, 0, "CLASS");
+       Expr.find.CLASS = function(match, context, isXML) {
+               if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+                       return context.getElementsByClassName(match[1]);
+               }
+       };
+
+       div = null; // release memory in IE
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+               var elem = checkSet[i];
+               if ( elem ) {
+                       elem = elem[dir];
+                       var match = false;
+
+                       while ( elem ) {
+                               if ( elem.sizcache === doneName ) {
+                                       match = checkSet[elem.sizset];
+                                       break;
+                               }
+
+                               if ( elem.nodeType === 1 && !isXML ){
+                                       elem.sizcache = doneName;
+                                       elem.sizset = i;
+                               }
+
+                               if ( elem.nodeName.toLowerCase() === cur ) {
+                                       match = elem;
+                                       break;
+                               }
+
+                               elem = elem[dir];
+                       }
+
+                       checkSet[i] = match;
+               }
+       }
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+               var elem = checkSet[i];
+               if ( elem ) {
+                       elem = elem[dir];
+                       var match = false;
+
+                       while ( elem ) {
+                               if ( elem.sizcache === doneName ) {
+                                       match = checkSet[elem.sizset];
+                                       break;
+                               }
+
+                               if ( elem.nodeType === 1 ) {
+                                       if ( !isXML ) {
+                                               elem.sizcache = doneName;
+                                               elem.sizset = i;
+                                       }
+                                       if ( typeof cur !== "string" ) {
+                                               if ( elem === cur ) {
+                                                       match = true;
+                                                       break;
+                                               }
+
+                                       } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+                                               match = elem;
+                                               break;
+                                       }
+                               }
+
+                               elem = elem[dir];
+                       }
+
+                       checkSet[i] = match;
+               }
+       }
+}
+
+var contains = document.compareDocumentPosition ? function(a, b){
+       return !!(a.compareDocumentPosition(b) & 16);
+} : function(a, b){
+       return a !== b && (a.contains ? a.contains(b) : true);
+};
+
+var isXML = function(elem){
+       // documentElement is verified for cases where it doesn't yet exist
+       // (such as loading iframes in IE - #4833) 
+       var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+       return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function(selector, context){
+       var tmpSet = [], later = "", match,
+               root = context.nodeType ? [context] : context;
+
+       // Position selectors must be done after the filter
+       // And so must :not(positional) so we move all PSEUDOs to the end
+       while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+               later += match[0];
+               selector = selector.replace( Expr.match.PSEUDO, "" );
+       }
+
+       selector = Expr.relative[selector] ? selector + "*" : selector;
+
+       for ( var i = 0, l = root.length; i < l; i++ ) {
+               Sizzle( selector, root[i], tmpSet );
+       }
+
+       return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = getText;
+jQuery.isXMLDoc = isXML;
+jQuery.contains = contains;
+
+return;
+
+window.Sizzle = Sizzle;
+
+})();
+var runtil = /Until$/,
+       rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+       // Note: This RegExp should be improved, or likely pulled from Sizzle
+       rmultiselector = /,/,
+       slice = Array.prototype.slice;
+
+// Implement the identical functionality for filter and not
+var winnow = function( elements, qualifier, keep ) {
+       if ( jQuery.isFunction( qualifier ) ) {
+               return jQuery.grep(elements, function( elem, i ) {
+                       return !!qualifier.call( elem, i, elem ) === keep;
+               });
+
+       } else if ( qualifier.nodeType ) {
+               return jQuery.grep(elements, function( elem, i ) {
+                       return (elem === qualifier) === keep;
+               });
+
+       } else if ( typeof qualifier === "string" ) {
+               var filtered = jQuery.grep(elements, function( elem ) {
+                       return elem.nodeType === 1;
+               });
+
+               if ( isSimple.test( qualifier ) ) {
+                       return jQuery.filter(qualifier, filtered, !keep);
+               } else {
+                       qualifier = jQuery.filter( qualifier, filtered );
+               }
+       }
+
+       return jQuery.grep(elements, function( elem, i ) {
+               return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
+       });
+};
+
+jQuery.fn.extend({
+       find: function( selector ) {
+               var ret = this.pushStack( "", "find", selector ), length = 0;
+
+               for ( var i = 0, l = this.length; i < l; i++ ) {
+                       length = ret.length;
+                       jQuery.find( selector, this[i], ret );
+
+                       if ( i > 0 ) {
+                               // Make sure that the results are unique
+                               for ( var n = length; n < ret.length; n++ ) {
+                                       for ( var r = 0; r < length; r++ ) {
+                                               if ( ret[r] === ret[n] ) {
+                                                       ret.splice(n--, 1);
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               return ret;
+       },
+
+       has: function( target ) {
+               var targets = jQuery( target );
+               return this.filter(function() {
+                       for ( var i = 0, l = targets.length; i < l; i++ ) {
+                               if ( jQuery.contains( this, targets[i] ) ) {
+                                       return true;
+                               }
+                       }
+               });
+       },
+
+       not: function( selector ) {
+               return this.pushStack( winnow(this, selector, false), "not", selector);
+       },
+
+       filter: function( selector ) {
+               return this.pushStack( winnow(this, selector, true), "filter", selector );
+       },
+       
+       is: function( selector ) {
+               return !!selector && jQuery.filter( selector, this ).length > 0;
+       },
+
+       closest: function( selectors, context ) {
+               if ( jQuery.isArray( selectors ) ) {
+                       var ret = [], cur = this[0], match, matches = {}, selector;
+
+                       if ( cur && selectors.length ) {
+                               for ( var i = 0, l = selectors.length; i < l; i++ ) {
+                                       selector = selectors[i];
+
+                                       if ( !matches[selector] ) {
+                                               matches[selector] = jQuery.expr.match.POS.test( selector ) ? 
+                                                       jQuery( selector, context || this.context ) :
+                                                       selector;
+                                       }
+                               }
+
+                               while ( cur && cur.ownerDocument && cur !== context ) {
+                                       for ( selector in matches ) {
+                                               match = matches[selector];
+
+                                               if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
+                                                       ret.push({ selector: selector, elem: cur });
+                                                       delete matches[selector];
+                                               }
+                                       }
+                                       cur = cur.parentNode;
+                               }
+                       }
+
+                       return ret;
+               }
+
+               var pos = jQuery.expr.match.POS.test( selectors ) ? 
+                       jQuery( selectors, context || this.context ) : null;
+
+               return this.map(function( i, cur ) {
+                       while ( cur && cur.ownerDocument && cur !== context ) {
+                               if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
+                                       return cur;
+                               }
+                               cur = cur.parentNode;
+                       }
+                       return null;
+               });
+       },
+       
+       // Determine the position of an element within
+       // the matched set of elements
+       index: function( elem ) {
+               if ( !elem || typeof elem === "string" ) {
+                       return jQuery.inArray( this[0],
+                               // If it receives a string, the selector is used
+                               // If it receives nothing, the siblings are used
+                               elem ? jQuery( elem ) : this.parent().children() );
+               }
+               // Locate the position of the desired element
+               return jQuery.inArray(
+                       // If it receives a jQuery object, the first element is used
+                       elem.jquery ? elem[0] : elem, this );
+       },
+
+       add: function( selector, context ) {
+               var set = typeof selector === "string" ?
+                               jQuery( selector, context || this.context ) :
+                               jQuery.makeArray( selector ),
+                       all = jQuery.merge( this.get(), set );
+
+               return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+                       all :
+                       jQuery.unique( all ) );
+       },
+
+       andSelf: function() {
+               return this.add( this.prevObject );
+       }
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+       return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+       parent: function( elem ) {
+               var parent = elem.parentNode;
+               return parent && parent.nodeType !== 11 ? parent : null;
+       },
+       parents: function( elem ) {
+               return jQuery.dir( elem, "parentNode" );
+       },
+       parentsUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "parentNode", until );
+       },
+       next: function( elem ) {
+               return jQuery.nth( elem, 2, "nextSibling" );
+       },
+       prev: function( elem ) {
+               return jQuery.nth( elem, 2, "previousSibling" );
+       },
+       nextAll: function( elem ) {
+               return jQuery.dir( elem, "nextSibling" );
+       },
+       prevAll: function( elem ) {
+               return jQuery.dir( elem, "previousSibling" );
+       },
+       nextUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "nextSibling", until );
+       },
+       prevUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "previousSibling", until );
+       },
+       siblings: function( elem ) {
+               return jQuery.sibling( elem.parentNode.firstChild, elem );
+       },
+       children: function( elem ) {
+               return jQuery.sibling( elem.firstChild );
+       },
+       contents: function( elem ) {
+               return jQuery.nodeName( elem, "iframe" ) ?
+                       elem.contentDocument || elem.contentWindow.document :
+                       jQuery.makeArray( elem.childNodes );
+       }
+}, function( name, fn ) {
+       jQuery.fn[ name ] = function( until, selector ) {
+               var ret = jQuery.map( this, fn, until );
+               
+               if ( !runtil.test( name ) ) {
+                       selector = until;
+               }
+
+               if ( selector && typeof selector === "string" ) {
+                       ret = jQuery.filter( selector, ret );
+               }
+
+               ret = this.length > 1 ? jQuery.unique( ret ) : ret;
+
+               if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+                       ret = ret.reverse();
+               }
+
+               return this.pushStack( ret, name, slice.call(arguments).join(",") );
+       };
+});
+
+jQuery.extend({
+       filter: function( expr, elems, not ) {
+               if ( not ) {
+                       expr = ":not(" + expr + ")";
+               }
+
+               return jQuery.find.matches(expr, elems);
+       },
+       
+       dir: function( elem, dir, until ) {
+               var matched = [], cur = elem[dir];
+               while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+                       if ( cur.nodeType === 1 ) {
+                               matched.push( cur );
+                       }
+                       cur = cur[dir];
+               }
+               return matched;
+       },
+
+       nth: function( cur, result, dir, elem ) {
+               result = result || 1;
+               var num = 0;
+
+               for ( ; cur; cur = cur[dir] ) {
+                       if ( cur.nodeType === 1 && ++num === result ) {
+                               break;
+                       }
+               }
+
+               return cur;
+       },
+
+       sibling: function( n, elem ) {
+               var r = [];
+
+               for ( ; n; n = n.nextSibling ) {
+                       if ( n.nodeType === 1 && n !== elem ) {
+                               r.push( n );
+                       }
+               }
+
+               return r;
+       }
+});
+var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+       rleadingWhitespace = /^\s+/,
+       rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g,
+       rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,
+       rtagName = /<([\w:]+)/,
+       rtbody = /<tbody/i,
+       rhtml = /<|&#?\w+;/,
+       rnocache = /<script|<object|<embed|<option|<style/i,
+       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,  // checked="checked" or checked (html5)
+       fcloseTag = function( all, front, tag ) {
+               return rselfClosing.test( tag ) ?
+                       all :
+                       front + "></" + tag + ">";
+       },
+       wrapMap = {
+               option: [ 1, "<select multiple='multiple'>", "</select>" ],
+               legend: [ 1, "<fieldset>", "</fieldset>" ],
+               thead: [ 1, "<table>", "</table>" ],
+               tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+               td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+               area: [ 1, "<map>", "</map>" ],
+               _default: [ 0, "", "" ]
+       };
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+       wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+       text: function( text ) {
+               if ( jQuery.isFunction(text) ) {
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               self.text( text.call(this, i, self.text()) );
+                       });
+               }
+
+               if ( typeof text !== "object" && text !== undefined ) {
+                       return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+               }
+
+               return jQuery.text( this );
+       },
+
+       wrapAll: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapAll( html.call(this, i) );
+                       });
+               }
+
+               if ( this[0] ) {
+                       // The elements to wrap the target around
+                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+                       if ( this[0].parentNode ) {
+                               wrap.insertBefore( this[0] );
+                       }
+
+                       wrap.map(function() {
+                               var elem = this;
+
+                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+                                       elem = elem.firstChild;
+                               }
+
+                               return elem;
+                       }).append(this);
+               }
+
+               return this;
+       },
+
+       wrapInner: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapInner( html.call(this, i) );
+                       });
+               }
+
+               return this.each(function() {
+                       var self = jQuery( this ), contents = self.contents();
+
+                       if ( contents.length ) {
+                               contents.wrapAll( html );
+
+                       } else {
+                               self.append( html );
+                       }
+               });
+       },
+
+       wrap: function( html ) {
+               return this.each(function() {
+                       jQuery( this ).wrapAll( html );
+               });
+       },
+
+       unwrap: function() {
+               return this.parent().each(function() {
+                       if ( !jQuery.nodeName( this, "body" ) ) {
+                               jQuery( this ).replaceWith( this.childNodes );
+                       }
+               }).end();
+       },
+
+       append: function() {
+               return this.domManip(arguments, true, function( elem ) {
+                       if ( this.nodeType === 1 ) {
+                               this.appendChild( elem );
+                       }
+               });
+       },
+
+       prepend: function() {
+               return this.domManip(arguments, true, function( elem ) {
+                       if ( this.nodeType === 1 ) {
+                               this.insertBefore( elem, this.firstChild );
+                       }
+               });
+       },
+
+       before: function() {
+               if ( this[0] && this[0].parentNode ) {
+                       return this.domManip(arguments, false, function( elem ) {
+                               this.parentNode.insertBefore( elem, this );
+                       });
+               } else if ( arguments.length ) {
+                       var set = jQuery(arguments[0]);
+                       set.push.apply( set, this.toArray() );
+                       return this.pushStack( set, "before", arguments );
+               }
+       },
+
+       after: function() {
+               if ( this[0] && this[0].parentNode ) {
+                       return this.domManip(arguments, false, function( elem ) {
+                               this.parentNode.insertBefore( elem, this.nextSibling );
+                       });
+               } else if ( arguments.length ) {
+                       var set = this.pushStack( this, "after", arguments );
+                       set.push.apply( set, jQuery(arguments[0]).toArray() );
+                       return set;
+               }
+       },
+       
+       // keepData is for internal use only--do not document
+       remove: function( selector, keepData ) {
+               for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+                       if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+                               if ( !keepData && elem.nodeType === 1 ) {
+                                       jQuery.cleanData( elem.getElementsByTagName("*") );
+                                       jQuery.cleanData( [ elem ] );
+                               }
+
+                               if ( elem.parentNode ) {
+                                        elem.parentNode.removeChild( elem );
+                               }
+                       }
+               }
+               
+               return this;
+       },
+
+       empty: function() {
+               for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+                       // Remove element nodes and prevent memory leaks
+                       if ( elem.nodeType === 1 ) {
+                               jQuery.cleanData( elem.getElementsByTagName("*") );
+                       }
+
+                       // Remove any remaining nodes
+                       while ( elem.firstChild ) {
+                               elem.removeChild( elem.firstChild );
+                       }
+               }
+               
+               return this;
+       },
+
+       clone: function( events ) {
+               // Do the clone
+               var ret = this.map(function() {
+                       if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
+                               // IE copies events bound via attachEvent when
+                               // using cloneNode. Calling detachEvent on the
+                               // clone will also remove the events from the orignal
+                               // In order to get around this, we use innerHTML.
+                               // Unfortunately, this means some modifications to
+                               // attributes in IE that are actually only stored
+                               // as properties will not be copied (such as the
+                               // the name attribute on an input).
+                               var html = this.outerHTML, ownerDocument = this.ownerDocument;
+                               if ( !html ) {
+                                       var div = ownerDocument.createElement("div");
+                                       div.appendChild( this.cloneNode(true) );
+                                       html = div.innerHTML;
+                               }
+
+                               return jQuery.clean([html.replace(rinlinejQuery, "")
+                                       // Handle the case in IE 8 where action=/test/> self-closes a tag
+                                       .replace(/=([^="'>\s]+\/)>/g, '="$1">')
+                                       .replace(rleadingWhitespace, "")], ownerDocument)[0];
+                       } else {
+                               return this.cloneNode(true);
+                       }
+               });
+
+               // Copy the events from the original to the clone
+               if ( events === true ) {
+                       cloneCopyEvent( this, ret );
+                       cloneCopyEvent( this.find("*"), ret.find("*") );
+               }
+
+               // Return the cloned set
+               return ret;
+       },
+
+       html: function( value ) {
+               if ( value === undefined ) {
+                       return this[0] && this[0].nodeType === 1 ?
+                               this[0].innerHTML.replace(rinlinejQuery, "") :
+                               null;
+
+               // See if we can take a shortcut and just use innerHTML
+               } else if ( typeof value === "string" && !rnocache.test( value ) &&
+                       (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+                       !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+                       value = value.replace(rxhtmlTag, fcloseTag);
+
+                       try {
+                               for ( var i = 0, l = this.length; i < l; i++ ) {
+                                       // Remove element nodes and prevent memory leaks
+                                       if ( this[i].nodeType === 1 ) {
+                                               jQuery.cleanData( this[i].getElementsByTagName("*") );
+                                               this[i].innerHTML = value;
+                                       }
+                               }
+
+                       // If using innerHTML throws an exception, use the fallback method
+                       } catch(e) {
+                               this.empty().append( value );
+                       }
+
+               } else if ( jQuery.isFunction( value ) ) {
+                       this.each(function(i){
+                               var self = jQuery(this), old = self.html();
+                               self.empty().append(function(){
+                                       return value.call( this, i, old );
+                               });
+                       });
+
+               } else {
+                       this.empty().append( value );
+               }
+
+               return this;
+       },
+
+       replaceWith: function( value ) {
+               if ( this[0] && this[0].parentNode ) {
+                       // Make sure that the elements are removed from the DOM before they are inserted
+                       // this can help fix replacing a parent with child elements
+                       if ( jQuery.isFunction( value ) ) {
+                               return this.each(function(i) {
+                                       var self = jQuery(this), old = self.html();
+                                       self.replaceWith( value.call( this, i, old ) );
+                               });
+                       }
+
+                       if ( typeof value !== "string" ) {
+                               value = jQuery(value).detach();
+                       }
+
+                       return this.each(function() {
+                               var next = this.nextSibling, parent = this.parentNode;
+
+                               jQuery(this).remove();
+
+                               if ( next ) {
+                                       jQuery(next).before( value );
+                               } else {
+                                       jQuery(parent).append( value );
+                               }
+                       });
+               } else {
+                       return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
+               }
+       },
+
+       detach: function( selector ) {
+               return this.remove( selector, true );
+       },
+
+       domManip: function( args, table, callback ) {
+               var results, first, value = args[0], scripts = [], fragment, parent;
+
+               // We can't cloneNode fragments that contain checked, in WebKit
+               if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+                       return this.each(function() {
+                               jQuery(this).domManip( args, table, callback, true );
+                       });
+               }
+
+               if ( jQuery.isFunction(value) ) {
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               args[0] = value.call(this, i, table ? self.html() : undefined);
+                               self.domManip( args, table, callback );
+                       });
+               }
+
+               if ( this[0] ) {
+                       parent = value && value.parentNode;
+
+                       // If we're in a fragment, just use that instead of building a new one
+                       if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+                               results = { fragment: parent };
+
+                       } else {
+                               results = buildFragment( args, this, scripts );
+                       }
+                       
+                       fragment = results.fragment;
+                       
+                       if ( fragment.childNodes.length === 1 ) {
+                               first = fragment = fragment.firstChild;
+                       } else {
+                               first = fragment.firstChild;
+                       }
+
+                       if ( first ) {
+                               table = table && jQuery.nodeName( first, "tr" );
+
+                               for ( var i = 0, l = this.length; i < l; i++ ) {
+                                       callback.call(
+                                               table ?
+                                                       root(this[i], first) :
+                                                       this[i],
+                                               i > 0 || results.cacheable || this.length > 1  ?
+                                                       fragment.cloneNode(true) :
+                                                       fragment
+                                       );
+                               }
+                       }
+
+                       if ( scripts.length ) {
+                               jQuery.each( scripts, evalScript );
+                       }
+               }
+
+               return this;
+
+               function root( elem, cur ) {
+                       return jQuery.nodeName(elem, "table") ?
+                               (elem.getElementsByTagName("tbody")[0] ||
+                               elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+                               elem;
+               }
+       }
+});
+
+function cloneCopyEvent(orig, ret) {
+       var i = 0;
+
+       ret.each(function() {
+               if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
+                       return;
+               }
+
+               var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;
+
+               if ( events ) {
+                       delete curData.handle;
+                       curData.events = {};
+
+                       for ( var type in events ) {
+                               for ( var handler in events[ type ] ) {
+                                       jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
+                               }
+                       }
+               }
+       });
+}
+
+function buildFragment( args, nodes, scripts ) {
+       var fragment, cacheable, cacheresults,
+               doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
+
+       // Only cache "small" (1/2 KB) strings that are associated with the main document
+       // Cloning options loses the selected state, so don't cache them
+       // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+       // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+       if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+               !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+
+               cacheable = true;
+               cacheresults = jQuery.fragments[ args[0] ];
+               if ( cacheresults ) {
+                       if ( cacheresults !== 1 ) {
+                               fragment = cacheresults;
+                       }
+               }
+       }
+
+       if ( !fragment ) {
+               fragment = doc.createDocumentFragment();
+               jQuery.clean( args, doc, fragment, scripts );
+       }
+
+       if ( cacheable ) {
+               jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
+       }
+
+       return { fragment: fragment, cacheable: cacheable };
+}
+
+jQuery.fragments = {};
+
+jQuery.each({
+       appendTo: "append",
+       prependTo: "prepend",
+       insertBefore: "before",
+       insertAfter: "after",
+       replaceAll: "replaceWith"
+}, function( name, original ) {
+       jQuery.fn[ name ] = function( selector ) {
+               var ret = [], insert = jQuery( selector ),
+                       parent = this.length === 1 && this[0].parentNode;
+               
+               if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+                       insert[ original ]( this[0] );
+                       return this;
+                       
+               } else {
+                       for ( var i = 0, l = insert.length; i < l; i++ ) {
+                               var elems = (i > 0 ? this.clone(true) : this).get();
+                               jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
+                               ret = ret.concat( elems );
+                       }
+               
+                       return this.pushStack( ret, name, insert.selector );
+               }
+       };
+});
+
+jQuery.extend({
+       clean: function( elems, context, fragment, scripts ) {
+               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;
+               }
+
+               var ret = [];
+
+               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+                       if ( typeof elem === "number" ) {
+                               elem += "";
+                       }
+
+                       if ( !elem ) {
+                               continue;
+                       }
+
+                       // Convert html string into DOM nodes
+                       if ( typeof elem === "string" && !rhtml.test( elem ) ) {
+                               elem = context.createTextNode( elem );
+
+                       } else if ( typeof elem === "string" ) {
+                               // Fix "XHTML"-style tags in all browsers
+                               elem = elem.replace(rxhtmlTag, fcloseTag);
+
+                               // Trim whitespace, otherwise indexOf won't work as expected
+                               var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
+                                       wrap = wrapMap[ tag ] || wrapMap._default,
+                                       depth = wrap[0],
+                                       div = context.createElement("div");
+
+                               // Go to html and back, then peel off extra wrappers
+                               div.innerHTML = wrap[1] + elem + wrap[2];
+
+                               // Move to the right depth
+                               while ( depth-- ) {
+                                       div = div.lastChild;
+                               }
+
+                               // Remove IE's autoinserted <tbody> from table fragments
+                               if ( !jQuery.support.tbody ) {
+
+                                       // String was a <table>, *may* have spurious <tbody>
+                                       var hasBody = rtbody.test(elem),
+                                               tbody = tag === "table" && !hasBody ?
+                                                       div.firstChild && div.firstChild.childNodes :
+
+                                                       // String was a bare <thead> or <tfoot>
+                                                       wrap[1] === "<table>" && !hasBody ?
+                                                               div.childNodes :
+                                                               [];
+
+                                       for ( var j = tbody.length - 1; j >= 0 ; --j ) {
+                                               if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+                                                       tbody[ j ].parentNode.removeChild( tbody[ j ] );
+                                               }
+                                       }
+
+                               }
+
+                               // IE completely kills leading whitespace when innerHTML is used
+                               if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+                                       div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+                               }
+
+                               elem = div.childNodes;
+                       }
+
+                       if ( elem.nodeType ) {
+                               ret.push( elem );
+                       } else {
+                               ret = jQuery.merge( ret, elem );
+                       }
+               }
+
+               if ( fragment ) {
+                       for ( var i = 0; ret[i]; i++ ) {
+                               if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+                                       scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+                               
+                               } else {
+                                       if ( ret[i].nodeType === 1 ) {
+                                               ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
+                                       }
+                                       fragment.appendChild( ret[i] );
+                               }
+                       }
+               }
+
+               return ret;
+       },
+       
+       cleanData: function( elems ) {
+               var data, id, cache = jQuery.cache,
+                       special = jQuery.event.special,
+                       deleteExpando = jQuery.support.deleteExpando;
+               
+               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+                       id = elem[ jQuery.expando ];
+                       
+                       if ( id ) {
+                               data = cache[ id ];
+                               
+                               if ( data.events ) {
+                                       for ( var type in data.events ) {
+                                               if ( special[ type ] ) {
+                                                       jQuery.event.remove( elem, type );
+
+                                               } else {
+                                                       removeEvent( elem, type, data.handle );
+                                               }
+                                       }
+                               }
+                               
+                               if ( deleteExpando ) {
+                                       delete elem[ jQuery.expando ];
+
+                               } else if ( elem.removeAttribute ) {
+                                       elem.removeAttribute( jQuery.expando );
+                               }
+                               
+                               delete cache[ id ];
+                       }
+               }
+       }
+});
+// exclude the following css properties to add px
+var rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
+       ralpha = /alpha\([^)]*\)/,
+       ropacity = /opacity=([^)]*)/,
+       rfloat = /float/i,
+       rdashAlpha = /-([a-z])/ig,
+       rupper = /([A-Z])/g,
+       rnumpx = /^-?\d+(?:px)?$/i,
+       rnum = /^-?\d/,
+
+       cssShow = { position: "absolute", visibility: "hidden", display:"block" },
+       cssWidth = [ "Left", "Right" ],
+       cssHeight = [ "Top", "Bottom" ],
+
+       // cache check for defaultView.getComputedStyle
+       getComputedStyle = document.defaultView && document.defaultView.getComputedStyle,
+       // normalize float css property
+       styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat",
+       fcamelCase = function( all, letter ) {
+               return letter.toUpperCase();
+       };
+
+jQuery.fn.css = function( name, value ) {
+       return access( this, name, value, true, function( elem, name, value ) {
+               if ( value === undefined ) {
+                       return jQuery.curCSS( elem, name );
+               }
+               
+               if ( typeof value === "number" && !rexclude.test(name) ) {
+                       value += "px";
+               }
+
+               jQuery.style( elem, name, value );
+       });
+};
+
+jQuery.extend({
+       style: function( elem, name, value ) {
+               // don't set styles on text and comment nodes
+               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
+                       return undefined;
+               }
+
+               // ignore negative width and height values #1599
+               if ( (name === "width" || name === "height") && parseFloat(value) < 0 ) {
+                       value = undefined;
+               }
+
+               var style = elem.style || elem, set = value !== undefined;
+
+               // IE uses filters for opacity
+               if ( !jQuery.support.opacity && name === "opacity" ) {
+                       if ( set ) {
+                               // IE has trouble with opacity if it does not have layout
+                               // Force it by setting the zoom level
+                               style.zoom = 1;
+
+                               // Set the alpha filter to set the opacity
+                               var opacity = parseInt( value, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")";
+                               var filter = style.filter || jQuery.curCSS( elem, "filter" ) || "";
+                               style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : opacity;
+                       }
+
+                       return style.filter && style.filter.indexOf("opacity=") >= 0 ?
+                               (parseFloat( ropacity.exec(style.filter)[1] ) / 100) + "":
+                               "";
+               }
+
+               // Make sure we're using the right name for getting the float value
+               if ( rfloat.test( name ) ) {
+                       name = styleFloat;
+               }
+
+               name = name.replace(rdashAlpha, fcamelCase);
+
+               if ( set ) {
+                       style[ name ] = value;
+               }
+
+               return style[ name ];
+       },
+
+       css: function( elem, name, force, extra ) {
+               if ( name === "width" || name === "height" ) {
+                       var val, props = cssShow, which = name === "width" ? cssWidth : cssHeight;
+
+                       function getWH() {
+                               val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
+
+                               if ( extra === "border" ) {
+                                       return;
+                               }
+
+                               jQuery.each( which, function() {
+                                       if ( !extra ) {
+                                               val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
+                                       }
+
+                                       if ( extra === "margin" ) {
+                                               val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
+                                       } else {
+                                               val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
+                                       }
+                               });
+                       }
+
+                       if ( elem.offsetWidth !== 0 ) {
+                               getWH();
+                       } else {
+                               jQuery.swap( elem, props, getWH );
+                       }
+
+                       return Math.max(0, Math.round(val));
+               }
+
+               return jQuery.curCSS( elem, name, force );
+       },
+
+       curCSS: function( elem, name, force ) {
+               var ret, style = elem.style, filter;
+
+               // IE uses filters for opacity
+               if ( !jQuery.support.opacity && name === "opacity" && elem.currentStyle ) {
+                       ret = ropacity.test(elem.currentStyle.filter || "") ?
+                               (parseFloat(RegExp.$1) / 100) + "" :
+                               "";
+
+                       return ret === "" ?
+                               "1" :
+                               ret;
+               }
+
+               // Make sure we're using the right name for getting the float value
+               if ( rfloat.test( name ) ) {
+                       name = styleFloat;
+               }
+
+               if ( !force && style && style[ name ] ) {
+                       ret = style[ name ];
+
+               } else if ( getComputedStyle ) {
+
+                       // Only "float" is needed here
+                       if ( rfloat.test( name ) ) {
+                               name = "float";
+                       }
+
+                       name = name.replace( rupper, "-$1" ).toLowerCase();
+
+                       var defaultView = elem.ownerDocument.defaultView;
+
+                       if ( !defaultView ) {
+                               return null;
+                       }
+
+                       var computedStyle = defaultView.getComputedStyle( elem, null );
+
+                       if ( computedStyle ) {
+                               ret = computedStyle.getPropertyValue( name );
+                       }
+
+                       // We should always get a number back from opacity
+                       if ( name === "opacity" && ret === "" ) {
+                               ret = "1";
+                       }
+
+               } else if ( elem.currentStyle ) {
+                       var camelCase = name.replace(rdashAlpha, fcamelCase);
+
+                       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 ( !rnumpx.test( ret ) && rnum.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 = camelCase === "fontSize" ? "1em" : (ret || 0);
+                               ret = style.pixelLeft + "px";
+
+                               // Revert the changed values
+                               style.left = left;
+                               elem.runtimeStyle.left = rsLeft;
+                       }
+               }
+
+               return ret;
+       },
+
+       // 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 ];
+               }
+       }
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.hidden = function( elem ) {
+               var width = elem.offsetWidth, height = elem.offsetHeight,
+                       skip = elem.nodeName.toLowerCase() === "tr";
+
+               return width === 0 && height === 0 && !skip ?
+                       true :
+                       width > 0 && height > 0 && !skip ?
+                               false :
+                               jQuery.curCSS(elem, "display") === "none";
+       };
+
+       jQuery.expr.filters.visible = function( elem ) {
+               return !jQuery.expr.filters.hidden( elem );
+       };
+}
+var jsc = now(),
+       rscript = /<script(.|\s)*?\/script>/gi,
+       rselectTextarea = /select|textarea/i,
+       rinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,
+       jsre = /=\?(&|$)/,
+       rquery = /\?/,
+       rts = /(\?|&)_=.*?(&|$)/,
+       rurl = /^(\w+:)?\/\/([^\/?#]+)/,
+       r20 = /%20/g,
+
+       // Keep a copy of the old load method
+       _load = jQuery.fn.load;
+
+jQuery.fn.extend({
+       load: function( url, params, callback ) {
+               if ( typeof url !== "string" ) {
+                       return _load.call( this, url );
+
+               // Don't do a request if no elements are being requested
+               } else if ( !this.length ) {
+                       return this;
+               }
+
+               var off = url.indexOf(" ");
+               if ( off >= 0 ) {
+                       var selector = url.slice(off, url.length);
+                       url = url.slice(0, off);
+               }
+
+               // Default to a GET request
+               var type = "GET";
+
+               // If the second parameter was provided
+               if ( params ) {
+                       // If it's a function
+                       if ( jQuery.isFunction( params ) ) {
+                               // We assume that it's the callback
+                               callback = params;
+                               params = null;
+
+                       // Otherwise, build a param string
+                       } else if ( typeof params === "object" ) {
+                               params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+                               type = "POST";
+                       }
+               }
+
+               var self = this;
+
+               // Request the remote document
+               jQuery.ajax({
+                       url: url,
+                       type: type,
+                       dataType: "html",
+                       data: params,
+                       complete: function( res, status ) {
+                               // If successful, inject the HTML into all the matched elements
+                               if ( status === "success" || status === "notmodified" ) {
+                                       // See if a selector was specified
+                                       self.html( selector ?
+                                               // Create a dummy div to hold the results
+                                               jQuery("<div />")
+                                                       // inject the contents of the document in, removing the scripts
+                                                       // to avoid any 'Permission Denied' errors in IE
+                                                       .append(res.responseText.replace(rscript, ""))
+
+                                                       // Locate the specified elements
+                                                       .find(selector) :
+
+                                               // If not, just inject the full result
+                                               res.responseText );
+                               }
+
+                               if ( callback ) {
+                                       self.each( callback, [res.responseText, status, res] );
+                               }
+                       }
+               });
+
+               return this;
+       },
+
+       serialize: function() {
+               return jQuery.param(this.serializeArray());
+       },
+       serializeArray: function() {
+               return this.map(function() {
+                       return this.elements ? jQuery.makeArray(this.elements) : this;
+               })
+               .filter(function() {
+                       return this.name && !this.disabled &&
+                               (this.checked || rselectTextarea.test(this.nodeName) ||
+                                       rinput.test(this.type));
+               })
+               .map(function( i, elem ) {
+                       var val = jQuery(this).val();
+
+                       return val == null ?
+                               null :
+                               jQuery.isArray(val) ?
+                                       jQuery.map( val, function( val, i ) {
+                                               return { name: elem.name, value: val };
+                                       }) :
+                                       { name: elem.name, value: val };
+               }).get();
+       }
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) {
+       jQuery.fn[o] = function( f ) {
+               return this.bind(o, f);
+       };
+});
+
+jQuery.extend({
+
+       get: function( url, data, callback, type ) {
+               // shift arguments if data argument was omited
+               if ( jQuery.isFunction( data ) ) {
+                       type = type || callback;
+                       callback = data;
+                       data = null;
+               }
+
+               return jQuery.ajax({
+                       type: "GET",
+                       url: url,
+                       data: data,
+                       success: callback,
+                       dataType: type
+               });
+       },
+
+       getScript: function( url, callback ) {
+               return jQuery.get(url, null, callback, "script");
+       },
+
+       getJSON: function( url, data, callback ) {
+               return jQuery.get(url, data, callback, "json");
+       },
+
+       post: function( url, data, callback, type ) {
+               // shift arguments if data argument was omited
+               if ( jQuery.isFunction( data ) ) {
+                       type = type || callback;
+                       callback = data;
+                       data = {};
+               }
+
+               return jQuery.ajax({
+                       type: "POST",
+                       url: url,
+                       data: data,
+                       success: callback,
+                       dataType: type
+               });
+       },
+
+       ajaxSetup: function( settings ) {
+               jQuery.extend( jQuery.ajaxSettings, settings );
+       },
+
+       ajaxSettings: {
+               url: location.href,
+               global: true,
+               type: "GET",
+               contentType: "application/x-www-form-urlencoded",
+               processData: true,
+               async: true,
+               /*
+               timeout: 0,
+               data: null,
+               username: null,
+               password: null,
+               traditional: false,
+               */
+               // Create the request object; Microsoft failed to properly
+               // implement the XMLHttpRequest in IE7 (can't request local files),
+               // so we use the ActiveXObject when it is available
+               // This function can be overriden by calling jQuery.ajaxSetup
+               xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ?
+                       function() {
+                               return new window.XMLHttpRequest();
+                       } :
+                       function() {
+                               try {
+                                       return new window.ActiveXObject("Microsoft.XMLHTTP");
+                               } catch(e) {}
+                       },
+               accepts: {
+                       xml: "application/xml, text/xml",
+                       html: "text/html",
+                       script: "text/javascript, application/javascript",
+                       json: "application/json, text/javascript",
+                       text: "text/plain",
+                       _default: "*/*"
+               }
+       },
+
+       // Last-Modified header cache for next request
+       lastModified: {},
+       etag: {},
+
+       ajax: function( origSettings ) {
+               var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);
+               
+               var jsonp, status, data,
+                       callbackContext = origSettings && origSettings.context || s,
+                       type = s.type.toUpperCase();
+
+               // convert data if not already a string
+               if ( s.data && s.processData && typeof s.data !== "string" ) {
+                       s.data = jQuery.param( s.data, s.traditional );
+               }
+
+               // Handle JSONP Parameter Callbacks
+               if ( s.dataType === "jsonp" ) {
+                       if ( type === "GET" ) {
+                               if ( !jsre.test( s.url ) ) {
+                                       s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
+                               }
+                       } else if ( !s.data || !jsre.test(s.data) ) {
+                               s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
+                       }
+                       s.dataType = "json";
+               }
+
+               // Build temporary JSONP function
+               if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
+                       jsonp = s.jsonpCallback || ("jsonp" + jsc++);
+
+                       // Replace the =? sequence both in the query string and the data
+                       if ( s.data ) {
+                               s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
+                       }
+
+                       s.url = s.url.replace(jsre, "=" + jsonp + "$1");
+
+                       // We need to make sure
+                       // that a JSONP style response is executed properly
+                       s.dataType = "script";
+
+                       // Handle JSONP-style loading
+                       window[ jsonp ] = window[ jsonp ] || function( tmp ) {
+                               data = tmp;
+                               success();
+                               complete();
+                               // Garbage collect
+                               window[ jsonp ] = undefined;
+
+                               try {
+                                       delete window[ jsonp ];
+                               } catch(e) {}
+
+                               if ( head ) {
+                                       head.removeChild( script );
+                               }
+                       };
+               }
+
+               if ( s.dataType === "script" && s.cache === null ) {
+                       s.cache = false;
+               }
+
+               if ( s.cache === false && type === "GET" ) {
+                       var ts = now();
+
+                       // try replacing _= if it is there
+                       var ret = s.url.replace(rts, "$1_=" + ts + "$2");
+
+                       // if nothing was replaced, add timestamp to the end
+                       s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
+               }
+
+               // If data is available, append data to url for get requests
+               if ( s.data && type === "GET" ) {
+                       s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
+               }
+
+               // Watch for a new set of requests
+               if ( s.global && ! jQuery.active++ ) {
+                       jQuery.event.trigger( "ajaxStart" );
+               }
+
+               // Matches an absolute URL, and saves the domain
+               var parts = rurl.exec( s.url ),
+                       remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
+
+               // If we're requesting a remote document
+               // and trying to load JSON or Script with a GET
+               if ( s.dataType === "script" && type === "GET" && remote ) {
+                       var head = document.getElementsByTagName("head")[0] || document.documentElement;
+                       var script = document.createElement("script");
+                       script.src = s.url;
+                       if ( s.scriptCharset ) {
+                               script.charset = s.scriptCharset;
+                       }
+
+                       // Handle Script loading
+                       if ( !jsonp ) {
+                               var done = false;
+
+                               // Attach handlers for all browsers
+                               script.onload = script.onreadystatechange = function() {
+                                       if ( !done && (!this.readyState ||
+                                                       this.readyState === "loaded" || this.readyState === "complete") ) {
+                                               done = true;
+                                               success();
+                                               complete();
+
+                                               // Handle memory leak in IE
+                                               script.onload = script.onreadystatechange = null;
+                                               if ( head && script.parentNode ) {
+                                                       head.removeChild( script );
+                                               }
+                                       }
+                               };
+                       }
+
+                       // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+                       // This arises when a base node is used (#2709 and #4378).
+                       head.insertBefore( script, head.firstChild );
+
+                       // We handle everything using the script element injection
+                       return undefined;
+               }
+
+               var requestDone = false;
+
+               // Create the request object
+               var xhr = s.xhr();
+
+               if ( !xhr ) {
+                       return;
+               }
+
+               // Open the socket
+               // Passing null username, generates a login popup on Opera (#2865)
+               if ( s.username ) {
+                       xhr.open(type, s.url, s.async, s.username, s.password);
+               } else {
+                       xhr.open(type, s.url, s.async);
+               }
+
+               // Need an extra try/catch for cross domain requests in Firefox 3
+               try {
+                       // Set the correct header, if data is being sent
+                       if ( s.data || origSettings && origSettings.contentType ) {
+                               xhr.setRequestHeader("Content-Type", s.contentType);
+                       }
+
+                       // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                       if ( s.ifModified ) {
+                               if ( jQuery.lastModified[s.url] ) {
+                                       xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
+                               }
+
+                               if ( jQuery.etag[s.url] ) {
+                                       xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
+                               }
+                       }
+
+                       // Set header so the called script knows that it's an XMLHttpRequest
+                       // Only send the header if it's not a remote XHR
+                       if ( !remote ) {
+                               xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+                       }
+
+                       // Set the Accepts header for the server, depending on the dataType
+                       xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
+                               s.accepts[ s.dataType ] + ", */*" :
+                               s.accepts._default );
+               } catch(e) {}
+
+               // Allow custom headers/mimetypes and early abort
+               if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) {
+                       // Handle the global AJAX counter
+                       if ( s.global && ! --jQuery.active ) {
+                               jQuery.event.trigger( "ajaxStop" );
+                       }
+
+                       // close opended socket
+                       xhr.abort();
+                       return false;
+               }
+
+               if ( s.global ) {
+                       trigger("ajaxSend", [xhr, s]);
+               }
+
+               // Wait for a response to come back
+               var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
+                       // The request was aborted
+                       if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) {
+                               // Opera doesn't call onreadystatechange before this point
+                               // so we simulate the call
+                               if ( !requestDone ) {
+                                       complete();
+                               }
+
+                               requestDone = true;
+                               if ( xhr ) {
+                                       xhr.onreadystatechange = jQuery.noop;
+                               }
+
+                       // The transfer is complete and the data is available, or the request timed out
+                       } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
+                               requestDone = true;
+                               xhr.onreadystatechange = jQuery.noop;
+
+                               status = isTimeout === "timeout" ?
+                                       "timeout" :
+                                       !jQuery.httpSuccess( xhr ) ?
+                                               "error" :
+                                               s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
+                                                       "notmodified" :
+                                                       "success";
+
+                               var errMsg;
+
+                               if ( status === "success" ) {
+                                       // Watch for, and catch, XML document parse errors
+                                       try {
+                                               // process the data (runs the xml through httpData regardless of callback)
+                                               data = jQuery.httpData( xhr, s.dataType, s );
+                                       } catch(err) {
+                                               status = "parsererror";
+                                               errMsg = err;
+                                       }
+                               }
+
+                               // Make sure that the request was successful or notmodified
+                               if ( status === "success" || status === "notmodified" ) {
+                                       // JSONP handles its own success callback
+                                       if ( !jsonp ) {
+                                               success();
+                                       }
+                               } else {
+                                       jQuery.handleError(s, xhr, status, errMsg);
+                               }
+
+                               // Fire the complete handlers
+                               complete();
+
+                               if ( isTimeout === "timeout" ) {
+                                       xhr.abort();
+                               }
+
+                               // Stop memory leaks
+                               if ( s.async ) {
+                                       xhr = null;
+                               }
+                       }
+               };
+
+               // Override the abort handler, if we can (IE doesn't allow it, but that's OK)
+               // Opera doesn't fire onreadystatechange at all on abort
+               try {
+                       var oldAbort = xhr.abort;
+                       xhr.abort = function() {
+                               if ( xhr ) {
+                                       oldAbort.call( xhr );
+                               }
+
+                               onreadystatechange( "abort" );
+                       };
+               } catch(e) { }
+
+               // Timeout checker
+               if ( s.async && s.timeout > 0 ) {
+                       setTimeout(function() {
+                               // Check to see if the request is still happening
+                               if ( xhr && !requestDone ) {
+                                       onreadystatechange( "timeout" );
+                               }
+                       }, s.timeout);
+               }
+
+               // Send the data
+               try {
+                       xhr.send( type === "POST" || type === "PUT" || type === "DELETE" ? s.data : null );
+               } catch(e) {
+                       jQuery.handleError(s, xhr, null, e);
+                       // Fire the complete handlers
+                       complete();
+               }
+
+               // firefox 1.5 doesn't fire statechange for sync requests
+               if ( !s.async ) {
+                       onreadystatechange();
+               }
+
+               function success() {
+                       // If a local callback was specified, fire it and pass it the data
+                       if ( s.success ) {
+                               s.success.call( callbackContext, data, status, xhr );
+                       }
+
+                       // Fire the global callback
+                       if ( s.global ) {
+                               trigger( "ajaxSuccess", [xhr, s] );
+                       }
+               }
+
+               function complete() {
+                       // Process result
+                       if ( s.complete ) {
+                               s.complete.call( callbackContext, xhr, status);
+                       }
+
+                       // The request was completed
+                       if ( s.global ) {
+                               trigger( "ajaxComplete", [xhr, s] );
+                       }
+
+                       // Handle the global AJAX counter
+                       if ( s.global && ! --jQuery.active ) {
+                               jQuery.event.trigger( "ajaxStop" );
+                       }
+               }
+               
+               function trigger(type, args) {
+                       (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
+               }
+
+               // return XMLHttpRequest to allow aborting the request etc.
+               return xhr;
+       },
+
+       handleError: function( s, xhr, status, e ) {
+               // If a local callback was specified, fire it
+               if ( s.error ) {
+                       s.error.call( s.context || s, xhr, status, e );
+               }
+
+               // Fire the global callback
+               if ( s.global ) {
+                       (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
+               }
+       },
+
+       // Counter for holding the number of active queries
+       active: 0,
+
+       // Determines if an XMLHttpRequest was successful or not
+       httpSuccess: function( xhr ) {
+               try {
+                       // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
+                       return !xhr.status && location.protocol === "file:" ||
+                               // Opera returns 0 when status is 304
+                               ( xhr.status >= 200 && xhr.status < 300 ) ||
+                               xhr.status === 304 || xhr.status === 1223 || xhr.status === 0;
+               } catch(e) {}
+
+               return false;
+       },
+
+       // Determines if an XMLHttpRequest returns NotModified
+       httpNotModified: function( xhr, url ) {
+               var lastModified = xhr.getResponseHeader("Last-Modified"),
+                       etag = xhr.getResponseHeader("Etag");
+
+               if ( lastModified ) {
+                       jQuery.lastModified[url] = lastModified;
+               }
+
+               if ( etag ) {
+                       jQuery.etag[url] = etag;
+               }
+
+               // Opera returns 0 when status is 304
+               return xhr.status === 304 || xhr.status === 0;
+       },
+
+       httpData: function( xhr, type, s ) {
+               var ct = xhr.getResponseHeader("content-type") || "",
+                       xml = type === "xml" || !type && ct.indexOf("xml") >= 0,
+                       data = xml ? xhr.responseXML : xhr.responseText;
+
+               if ( xml && data.documentElement.nodeName === "parsererror" ) {
+                       jQuery.error( "parsererror" );
+               }
+
+               // Allow a pre-filtering function to sanitize the response
+               // s is checked to keep backwards compatibility
+               if ( s && s.dataFilter ) {
+                       data = s.dataFilter( data, type );
+               }
+
+               // The filter can actually parse the response
+               if ( typeof data === "string" ) {
+                       // Get the JavaScript object, if JSON is used.
+                       if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {
+                               data = jQuery.parseJSON( data );
+
+                       // If the type is "script", eval it in global context
+                       } else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
+                               jQuery.globalEval( data );
+                       }
+               }
+
+               return data;
+       },
+
+       // Serialize an array of form elements or a set of
+       // key/values into a query string
+       param: function( a, traditional ) {
+               var s = [];
+               
+               // Set traditional to true for jQuery <= 1.3.2 behavior.
+               if ( traditional === undefined ) {
+                       traditional = jQuery.ajaxSettings.traditional;
+               }
+               
+               // If an array was passed in, assume that it is an array of form elements.
+               if ( jQuery.isArray(a) || a.jquery ) {
+                       // Serialize the form elements
+                       jQuery.each( a, function() {
+                               add( this.name, this.value );
+                       });
+                       
+               } else {
+                       // If traditional, encode the "old" way (the way 1.3.2 or older
+                       // did it), otherwise encode params recursively.
+                       for ( var prefix in a ) {
+                               buildParams( prefix, a[prefix] );
+                       }
+               }
+
+               // Return the resulting serialization
+               return s.join("&").replace(r20, "+");
+
+               function buildParams( prefix, obj ) {
+                       if ( jQuery.isArray(obj) ) {
+                               // Serialize array item.
+                               jQuery.each( obj, function( i, v ) {
+                                       if ( traditional || /\[\]$/.test( prefix ) ) {
+                                               // Treat each array item as a scalar.
+                                               add( prefix, v );
+                                       } else {
+                                               // If array item is non-scalar (array or object), encode its
+                                               // numeric index to resolve deserialization ambiguity issues.
+                                               // Note that rack (as of 1.0.0) can't currently deserialize
+                                               // nested arrays properly, and attempting to do so may cause
+                                               // a server error. Possible fixes are to modify rack's
+                                               // deserialization algorithm or to provide an option or flag
+                                               // to force array serialization to be shallow.
+                                               buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v );
+                                       }
+                               });
+                                       
+                       } else if ( !traditional && obj != null && typeof obj === "object" ) {
+                               // Serialize object item.
+                               jQuery.each( obj, function( k, v ) {
+                                       buildParams( prefix + "[" + k + "]", v );
+                               });
+                                       
+                       } else {
+                               // Serialize scalar item.
+                               add( prefix, obj );
+                       }
+               }
+
+               function add( key, value ) {
+                       // If value is a function, invoke it and return its value
+                       value = jQuery.isFunction(value) ? value() : value;
+                       s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
+               }
+       }
+});
+var elemdisplay = {},
+       rfxtypes = /toggle|show|hide/,
+       rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/,
+       timerId,
+       fxAttrs = [
+               // height animations
+               [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+               // width animations
+               [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+               // opacity animations
+               [ "opacity" ]
+       ];
+
+jQuery.fn.extend({
+       show: function( speed, callback ) {
+               if ( speed || speed === 0) {
+                       return this.animate( genFx("show", 3), speed, callback);
+
+               } else {
+                       for ( var i = 0, l = this.length; i < l; i++ ) {
+                               var old = jQuery.data(this[i], "olddisplay");
+
+                               this[i].style.display = old || "";
+
+                               if ( jQuery.css(this[i], "display") === "none" ) {
+                                       var nodeName = this[i].nodeName, display;
+
+                                       if ( elemdisplay[ nodeName ] ) {
+                                               display = elemdisplay[ nodeName ];
+
+                                       } else {
+                                               var elem = jQuery("<" + nodeName + " />").appendTo("body");
+
+                                               display = elem.css("display");
+
+                                               if ( display === "none" ) {
+                                                       display = "block";
+                                               }
+
+                                               elem.remove();
+
+                                               elemdisplay[ nodeName ] = display;
+                                       }
+
+                                       jQuery.data(this[i], "olddisplay", display);
+                               }
+                       }
+
+                       // Set the display of the elements in a second loop
+                       // to avoid the constant reflow
+                       for ( var j = 0, k = this.length; j < k; j++ ) {
+                               this[j].style.display = jQuery.data(this[j], "olddisplay") || "";
+                       }
+
+                       return this;
+               }
+       },
+
+       hide: function( speed, callback ) {
+               if ( speed || speed === 0 ) {
+                       return this.animate( genFx("hide", 3), speed, callback);
+
+               } else {
+                       for ( var i = 0, l = this.length; i < l; i++ ) {
+                               var old = jQuery.data(this[i], "olddisplay");
+                               if ( !old && old !== "none" ) {
+                                       jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
+                               }
+                       }
+
+                       // Set the display of the elements in a second loop
+                       // to avoid the constant reflow
+                       for ( var j = 0, k = this.length; j < k; j++ ) {
+                               this[j].style.display = "none";
+                       }
+
+                       return this;
+               }
+       },
+
+       // Save the old toggle function
+       _toggle: jQuery.fn.toggle,
+
+       toggle: function( fn, fn2 ) {
+               var bool = typeof fn === "boolean";
+
+               if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+                       this._toggle.apply( this, arguments );
+
+               } else if ( fn == null || bool ) {
+                       this.each(function() {
+                               var state = bool ? fn : jQuery(this).is(":hidden");
+                               jQuery(this)[ state ? "show" : "hide" ]();
+                       });
+
+               } else {
+                       this.animate(genFx("toggle", 3), fn, fn2);
+               }
+
+               return this;
+       },
+
+       fadeTo: function( speed, to, callback ) {
+               return this.filter(":hidden").css("opacity", 0).show().end()
+                                       .animate({opacity: to}, speed, callback);
+       },
+
+       animate: function( prop, speed, easing, callback ) {
+               var optall = jQuery.speed(speed, easing, callback);
+
+               if ( jQuery.isEmptyObject( prop ) ) {
+                       return this.each( optall.complete );
+               }
+
+               return this[ optall.queue === false ? "each" : "queue" ](function() {
+                       var opt = jQuery.extend({}, optall), p,
+                               hidden = this.nodeType === 1 && jQuery(this).is(":hidden"),
+                               self = this;
+
+                       for ( p in prop ) {
+                               var name = p.replace(rdashAlpha, fcamelCase);
+
+                               if ( p !== name ) {
+                                       prop[ name ] = prop[ p ];
+                                       delete prop[ p ];
+                                       p = name;
+                               }
+
+                               if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
+                                       return opt.complete.call(this);
+                               }
+
+                               if ( ( p === "height" || p === "width" ) && this.style ) {
+                                       // Store display property
+                                       opt.display = jQuery.css(this, "display");
+
+                                       // Make sure that nothing sneaks out
+                                       opt.overflow = this.style.overflow;
+                               }
+
+                               if ( jQuery.isArray( prop[p] ) ) {
+                                       // Create (if needed) and add to specialEasing
+                                       (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
+                                       prop[p] = prop[p][0];
+                               }
+                       }
+
+                       if ( opt.overflow != null ) {
+                               this.style.overflow = "hidden";
+                       }
+
+                       opt.curAnim = jQuery.extend({}, prop);
+
+                       jQuery.each( prop, function( name, val ) {
+                               var e = new jQuery.fx( self, opt, name );
+
+                               if ( rfxtypes.test(val) ) {
+                                       e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
+
+                               } else {
+                                       var parts = rfxnum.exec(val),
+                                               start = e.cur(true) || 0;
+
+                                       if ( parts ) {
+                                               var end = parseFloat( parts[2] ),
+                                                       unit = parts[3] || "px";
+
+                                               // We need to compute starting value
+                                               if ( unit !== "px" ) {
+                                                       self.style[ name ] = (end || 1) + unit;
+                                                       start = ((end || 1) / e.cur(true)) * start;
+                                                       self.style[ name ] = start + unit;
+                                               }
+
+                                               // If a +=/-= token was provided, we're doing a relative animation
+                                               if ( parts[1] ) {
+                                                       end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
+                                               }
+
+                                               e.custom( start, end, unit );
+
+                                       } else {
+                                               e.custom( start, val, "" );
+                                       }
+                               }
+                       });
+
+                       // For JS strict compliance
+                       return true;
+               });
+       },
+
+       stop: function( clearQueue, gotoEnd ) {
+               var timers = jQuery.timers;
+
+               if ( clearQueue ) {
+                       this.queue([]);
+               }
+
+               this.each(function() {
+                       // go in reverse order so anything added to the queue during the loop is ignored
+                       for ( var i = timers.length - 1; i >= 0; i-- ) {
+                               if ( timers[i].elem === this ) {
+                                       if (gotoEnd) {
+                                               // force the next step to be the last
+                                               timers[i](true);
+                                       }
+
+                                       timers.splice(i, 1);
+                               }
+                       }
+               });
+
+               // start the next in the queue if the last step wasn't forced
+               if ( !gotoEnd ) {
+                       this.dequeue();
+               }
+
+               return this;
+       }
+
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+       slideDown: genFx("show", 1),
+       slideUp: genFx("hide", 1),
+       slideToggle: genFx("toggle", 1),
+       fadeIn: { opacity: "show" },
+       fadeOut: { opacity: "hide" }
+}, function( name, props ) {
+       jQuery.fn[ name ] = function( speed, callback ) {
+               return this.animate( props, speed, callback );
+       };
+});
+
+jQuery.extend({
+       speed: function( speed, easing, fn ) {
+               var opt = speed && typeof speed === "object" ? speed : {
+                       complete: fn || !fn && easing ||
+                               jQuery.isFunction( speed ) && speed,
+                       duration: speed,
+                       easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+               };
+
+               opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+                       jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
+
+               // Queueing
+               opt.old = opt.complete;
+               opt.complete = function() {
+                       if ( opt.queue !== false ) {
+                               jQuery(this).dequeue();
+                       }
+                       if ( jQuery.isFunction( opt.old ) ) {
+                               opt.old.call( this );
+                       }
+               };
+
+               return opt;
+       },
+
+       easing: {
+               linear: function( p, n, firstNum, diff ) {
+                       return firstNum + diff * p;
+               },
+               swing: function( p, n, firstNum, diff ) {
+                       return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+               }
+       },
+
+       timers: [],
+
+       fx: function( elem, options, prop ) {
+               this.options = options;
+               this.elem = elem;
+               this.prop = prop;
+
+               if ( !options.orig ) {
+                       options.orig = {};
+               }
+       }
+
+});
+
+jQuery.fx.prototype = {
+       // Simple function for setting a style value
+       update: function() {
+               if ( this.options.step ) {
+                       this.options.step.call( this.elem, this.now, this );
+               }
+
+               (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+
+               // Set display property to block for height/width animations
+               if ( ( this.prop === "height" || this.prop === "width" ) && this.elem.style ) {
+                       this.elem.style.display = "block";
+               }
+       },
+
+       // Get the current size
+       cur: function( force ) {
+               if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+                       return this.elem[ this.prop ];
+               }
+
+               var r = parseFloat(jQuery.css(this.elem, this.prop, force));
+               return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
+       },
+
+       // Start an animation from one number to another
+       custom: function( from, to, unit ) {
+               this.startTime = now();
+               this.start = from;
+               this.end = to;
+               this.unit = unit || this.unit || "px";
+               this.now = this.start;
+               this.pos = this.state = 0;
+
+               var self = this;
+               function t( gotoEnd ) {
+                       return self.step(gotoEnd);
+               }
+
+               t.elem = this.elem;
+
+               if ( t() && jQuery.timers.push(t) && !timerId ) {
+                       timerId = setInterval(jQuery.fx.tick, 13);
+               }
+       },
+
+       // Simple 'show' function
+       show: function() {
+               // Remember where we started, so that we can go back to it later
+               this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+               this.options.show = true;
+
+               // Begin the animation
+               // Make sure that we start at a small width/height to avoid any
+               // flash of content
+               this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
+
+               // Start by showing the element
+               jQuery( this.elem ).show();
+       },
+
+       // Simple 'hide' function
+       hide: function() {
+               // Remember where we started, so that we can go back to it later
+               this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+               this.options.hide = true;
+
+               // Begin the animation
+               this.custom(this.cur(), 0);
+       },
+
+       // Each step of an animation
+       step: function( gotoEnd ) {
+               var t = now(), done = true;
+
+               if ( gotoEnd || t >= this.options.duration + this.startTime ) {
+                       this.now = this.end;
+                       this.pos = this.state = 1;
+                       this.update();
+
+                       this.options.curAnim[ this.prop ] = true;
+
+                       for ( var i in this.options.curAnim ) {
+                               if ( this.options.curAnim[i] !== true ) {
+                                       done = false;
+                               }
+                       }
+
+                       if ( done ) {
+                               if ( this.options.display != null ) {
+                                       // Reset the overflow
+                                       this.elem.style.overflow = this.options.overflow;
+
+                                       // Reset the display
+                                       var old = jQuery.data(this.elem, "olddisplay");
+                                       this.elem.style.display = old ? old : this.options.display;
+
+                                       if ( jQuery.css(this.elem, "display") === "none" ) {
+                                               this.elem.style.display = "block";
+                                       }
+                               }
+
+                               // Hide the element if the "hide" operation was done
+                               if ( this.options.hide ) {
+                                       jQuery(this.elem).hide();
+                               }
+
+                               // Reset the properties, if the item has been hidden or shown
+                               if ( this.options.hide || this.options.show ) {
+                                       for ( var p in this.options.curAnim ) {
+                                               jQuery.style(this.elem, p, this.options.orig[p]);
+                                       }
+                               }
+
+                               // Execute the complete function
+                               this.options.complete.call( this.elem );
+                       }
+
+                       return false;
+
+               } else {
+                       var n = t - this.startTime;
+                       this.state = n / this.options.duration;
+
+                       // Perform the easing function, defaults to swing
+                       var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
+                       var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
+                       this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
+                       this.now = this.start + ((this.end - this.start) * this.pos);
+
+                       // Perform the next step of the animation
+                       this.update();
+               }
+
+               return true;
+       }
+};
+
+jQuery.extend( jQuery.fx, {
+       tick: function() {
+               var timers = jQuery.timers;
+
+               for ( var i = 0; i < timers.length; i++ ) {
+                       if ( !timers[i]() ) {
+                               timers.splice(i--, 1);
+                       }
+               }
+
+               if ( !timers.length ) {
+                       jQuery.fx.stop();
+               }
+       },
+               
+       stop: function() {
+               clearInterval( timerId );
+               timerId = null;
+       },
+       
+       speeds: {
+               slow: 600,
+               fast: 200,
+               // Default speed
+               _default: 400
+       },
+
+       step: {
+               opacity: function( fx ) {
+                       jQuery.style(fx.elem, "opacity", fx.now);
+               },
+
+               _default: function( fx ) {
+                       if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+                               fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+                       } else {
+                               fx.elem[ fx.prop ] = fx.now;
+                       }
+               }
+       }
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.animated = function( elem ) {
+               return jQuery.grep(jQuery.timers, function( fn ) {
+                       return elem === fn.elem;
+               }).length;
+       };
+}
+
+function genFx( type, num ) {
+       var obj = {};
+
+       jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
+               obj[ this ] = type;
+       });
+
+       return obj;
+}
+if ( "getBoundingClientRect" in document.documentElement ) {
+       jQuery.fn.offset = function( options ) {
+               var elem = this[0];
+
+               if ( options ) { 
+                       return this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
+               }
+
+               if ( !elem || !elem.ownerDocument ) {
+                       return null;
+               }
+
+               if ( elem === elem.ownerDocument.body ) {
+                       return jQuery.offset.bodyOffset( elem );
+               }
+
+               var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement,
+                       clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
+                       top  = box.top  + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
+                       left = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
+
+               return { top: top, left: left };
+       };
+
+} else {
+       jQuery.fn.offset = function( options ) {
+               var elem = this[0];
+
+               if ( options ) { 
+                       return this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
+               }
+
+               if ( !elem || !elem.ownerDocument ) {
+                       return null;
+               }
+
+               if ( elem === elem.ownerDocument.body ) {
+                       return jQuery.offset.bodyOffset( elem );
+               }
+
+               jQuery.offset.initialize();
+
+               var offsetParent = elem.offsetParent, prevOffsetParent = elem,
+                       doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
+                       body = doc.body, defaultView = doc.defaultView,
+                       prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+                       top = elem.offsetTop, left = elem.offsetLeft;
+
+               while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+                       if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+                               break;
+                       }
+
+                       computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+                       top  -= elem.scrollTop;
+                       left -= elem.scrollLeft;
+
+                       if ( elem === offsetParent ) {
+                               top  += elem.offsetTop;
+                               left += elem.offsetLeft;
+
+                               if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) {
+                                       top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+                                       left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+                               }
+
+                               prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
+                       }
+
+                       if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+                               top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+                               left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+                       }
+
+                       prevComputedStyle = computedStyle;
+               }
+
+               if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+                       top  += body.offsetTop;
+                       left += body.offsetLeft;
+               }
+
+               if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+                       top  += Math.max( docElem.scrollTop, body.scrollTop );
+                       left += Math.max( docElem.scrollLeft, body.scrollLeft );
+               }
+
+               return { top: top, left: left };
+       };
+}
+
+jQuery.offset = {
+       initialize: function() {
+               var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0,
+                       html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+
+               jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
+
+               container.innerHTML = html;
+               body.insertBefore( container, body.firstChild );
+               innerDiv = container.firstChild;
+               checkDiv = innerDiv.firstChild;
+               td = innerDiv.nextSibling.firstChild.firstChild;
+
+               this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+               this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+               checkDiv.style.position = "fixed", checkDiv.style.top = "20px";
+               // safari subtracts parent border width here which is 5px
+               this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
+               checkDiv.style.position = checkDiv.style.top = "";
+
+               innerDiv.style.overflow = "hidden", innerDiv.style.position = "relative";
+               this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+               this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
+
+               body.removeChild( container );
+               body = container = innerDiv = checkDiv = table = td = null;
+               jQuery.offset.initialize = jQuery.noop;
+       },
+
+       bodyOffset: function( body ) {
+               var top = body.offsetTop, left = body.offsetLeft;
+
+               jQuery.offset.initialize();
+
+               if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
+                       top  += parseFloat( jQuery.curCSS(body, "marginTop",  true) ) || 0;
+                       left += parseFloat( jQuery.curCSS(body, "marginLeft", true) ) || 0;
+               }
+
+               return { top: top, left: left };
+       },
+       
+       setOffset: function( elem, options, i ) {
+               // set position first, in-case top/left are set even on static elem
+               if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {
+                       elem.style.position = "relative";
+               }
+               var curElem   = jQuery( elem ),
+                       curOffset = curElem.offset(),
+                       curTop    = parseInt( jQuery.curCSS( elem, "top",  true ), 10 ) || 0,
+                       curLeft   = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0;
+
+               if ( jQuery.isFunction( options ) ) {
+                       options = options.call( elem, i, curOffset );
+               }
+
+               var props = {
+                       top:  (options.top  - curOffset.top)  + curTop,
+                       left: (options.left - curOffset.left) + curLeft
+               };
+               
+               if ( "using" in options ) {
+                       options.using.call( elem, props );
+               } else {
+                       curElem.css( props );
+               }
+       }
+};
+
+
+jQuery.fn.extend({
+       position: function() {
+               if ( !this[0] ) {
+                       return null;
+               }
+
+               var elem = this[0],
+
+               // Get *real* offsetParent
+               offsetParent = this.offsetParent(),
+
+               // Get correct offsets
+               offset       = this.offset(),
+               parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+               // Subtract element margins
+               // note: when an element has margin: auto the offsetLeft and marginLeft
+               // are the same in Safari causing offset.left to incorrectly be 0
+               offset.top  -= parseFloat( jQuery.curCSS(elem, "marginTop",  true) ) || 0;
+               offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0;
+
+               // Add offsetParent borders
+               parentOffset.top  += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth",  true) ) || 0;
+               parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0;
+
+               // Subtract the two offsets
+               return {
+                       top:  offset.top  - parentOffset.top,
+                       left: offset.left - parentOffset.left
+               };
+       },
+
+       offsetParent: function() {
+               return this.map(function() {
+                       var offsetParent = this.offsetParent || document.body;
+                       while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+                               offsetParent = offsetParent.offsetParent;
+                       }
+                       return offsetParent;
+               });
+       }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+       var method = "scroll" + name;
+
+       jQuery.fn[ method ] = function(val) {
+               var elem = this[0], win;
+               
+               if ( !elem ) {
+                       return null;
+               }
+
+               if ( val !== undefined ) {
+                       // Set the scroll offset
+                       return this.each(function() {
+                               win = getWindow( this );
+
+                               if ( win ) {
+                                       win.scrollTo(
+                                               !i ? val : jQuery(win).scrollLeft(),
+                                                i ? val : jQuery(win).scrollTop()
+                                       );
+
+                               } else {
+                                       this[ method ] = val;
+                               }
+                       });
+               } else {
+                       win = getWindow( elem );
+
+                       // Return the scroll offset
+                       return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+                               jQuery.support.boxModel && win.document.documentElement[ method ] ||
+                                       win.document.body[ method ] :
+                               elem[ method ];
+               }
+       };
+});
+
+function getWindow( elem ) {
+       return ("scrollTo" in elem && elem.document) ?
+               elem :
+               elem.nodeType === 9 ?
+                       elem.defaultView || elem.parentWindow :
+                       false;
+}
+// Create innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+       var type = name.toLowerCase();
+
+       // innerHeight and innerWidth
+       jQuery.fn["inner" + name] = function() {
+               return this[0] ?
+                       jQuery.css( this[0], type, false, "padding" ) :
+                       null;
+       };
+
+       // outerHeight and outerWidth
+       jQuery.fn["outer" + name] = function( margin ) {
+               return this[0] ?
+                       jQuery.css( this[0], type, false, margin ? "margin" : "border" ) :
+                       null;
+       };
+
+       jQuery.fn[ type ] = function( size ) {
+               // Get window width or height
+               var elem = this[0];
+               if ( !elem ) {
+                       return size == null ? null : this;
+               }
+               
+               if ( jQuery.isFunction( size ) ) {
+                       return this.each(function( i ) {
+                               var self = jQuery( this );
+                               self[ type ]( size.call( this, i, self[ type ]() ) );
+                       });
+               }
+
+               return ("scrollTo" in elem && elem.document) ? // does it walk and quack like a window?
+                       // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+                       elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
+                       elem.document.body[ "client" + name ] :
+
+                       // Get document width or height
+                       (elem.nodeType === 9) ? // is it a document
+                               // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+                               Math.max(
+                                       elem.documentElement["client" + name],
+                                       elem.body["scroll" + name], elem.documentElement["scroll" + name],
+                                       elem.body["offset" + name], elem.documentElement["offset" + name]
+                               ) :
+
+                               // Get or set width or height on the element
+                               size === undefined ?
+                                       // Get width or height on the element
+                                       jQuery.css( elem, type ) :
+
+                                       // Set the width or height on the element (default to pixels if value is unitless)
+                                       this.css( type, typeof size === "string" ? size : size + "px" );
+       };
+
+});
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+})(window);
diff --git a/www/js/jquery-1.4.2.min.js b/www/js/jquery-1.4.2.min.js
new file mode 100644 (file)
index 0000000..7c24308
--- /dev/null
@@ -0,0 +1,154 @@
+/*!
+ * jQuery JavaScript Library v1.4.2
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Sat Feb 13 22:33:48 2010 -0500
+ */
+(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
+e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
+j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
+"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
+true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
+Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
+(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
+a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
+"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
+function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
+c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
+L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
+"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
+d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
+a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
+!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
+true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
+parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
+s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
+applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
+else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
+a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
+w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
+cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
+i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
+" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
+this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
+e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
+c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
+a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
+function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
+k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
+C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
+null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
+e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
+f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
+if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
+"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
+a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
+isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
+{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
+if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
+e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
+"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
+d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
+!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
+toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
+u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
+function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
+if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
+t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
+g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
+for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
+1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
+relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
+l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
+h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
+CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
+g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
+text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
+setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
+h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
+m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
+"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
+h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
+!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
+h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
+q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
+if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
+(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
+function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
+gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
+c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
+{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
+"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
+d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
+a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
+1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
+a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
+""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
+this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
+u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
+1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
+return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
+""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
+c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
+c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
+function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
+Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
+"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
+a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
+a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
+"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
+serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
+function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
+global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
+e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
+"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
+false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
+false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
+c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
+d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
+g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
+1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
+"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
+if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
+this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
+"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
+animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
+j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
+this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
+"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
+c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
+this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
+this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
+e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
+c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
+function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
+this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
+k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
+f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
+c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
+d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
+f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
+"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
+e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
diff --git a/www/js/jquery.jstree.js b/www/js/jquery.jstree.js
new file mode 100644 (file)
index 0000000..5037698
--- /dev/null
@@ -0,0 +1,3510 @@
+/*\r
+ * jsTree 1.0-rc1\r
+ * http://jstree.com/\r
+ *\r
+ * Copyright (c) 2010 Ivan Bozhanov (vakata.com)\r
+ *\r
+ * Dual licensed under the MIT and GPL licenses (same as jQuery):\r
+ *   http://www.opensource.org/licenses/mit-license.php\r
+ *   http://www.gnu.org/licenses/gpl.html\r
+ *\r
+ * $Date: 2010-07-01 10:51:11 +0300 (четв, 01 ÑŽÐ»Ð¸ 2010) $\r
+ * $Revision: 191 $\r
+ */\r
+\r
+/*jslint browser: true, onevar: true, undef: true, bitwise: true, strict: true */\r
+/*global window : false, clearInterval: false, clearTimeout: false, document: false, setInterval: false, setTimeout: false, jQuery: false, navigator: false, XSLTProcessor: false, DOMParser: false, XMLSerializer: false*/\r
+\r
+"use strict";\r
+// Common functions not related to jsTree \r
+// decided to move them to a `vakata` "namespace"\r
+(function ($) {\r
+       $.vakata = {};\r
+       // CSS related functions\r
+       $.vakata.css = {\r
+               get_css : function(rule_name, delete_flag, sheet) {\r
+                       rule_name = rule_name.toLowerCase();\r
+                       var css_rules = sheet.cssRules || sheet.rules,\r
+                               j = 0;\r
+                       do {\r
+                               if(css_rules.length && j > css_rules.length + 5) { return false; }\r
+                               if(css_rules[j].selectorText && css_rules[j].selectorText.toLowerCase() == rule_name) {\r
+                                       if(delete_flag === true) {\r
+                                               if(sheet.removeRule) { sheet.removeRule(j); }\r
+                                               if(sheet.deleteRule) { sheet.deleteRule(j); }\r
+                                               return true;\r
+                                       }\r
+                                       else { return css_rules[j]; }\r
+                               }\r
+                       }\r
+                       while (css_rules[++j]);\r
+                       return false;\r
+               },\r
+               add_css : function(rule_name, sheet) {\r
+                       if($.jstree.css.get_css(rule_name, false, sheet)) { return false; }\r
+                       if(sheet.insertRule) { sheet.insertRule(rule_name + ' { }', 0); } else { sheet.addRule(rule_name, null, 0); }\r
+                       return $.vakata.css.get_css(rule_name);\r
+               },\r
+               remove_css : function(rule_name, sheet) { \r
+                       return $.vakata.css.get_css(rule_name, true, sheet); \r
+               },\r
+               add_sheet : function(opts) {\r
+                       var tmp;\r
+                       if(opts.str) {\r
+                               tmp = document.createElement("style");\r
+                               tmp.setAttribute('type',"text/css");\r
+                               if(tmp.styleSheet) {\r
+                                       document.getElementsByTagName("head")[0].appendChild(tmp);\r
+                                       tmp.styleSheet.cssText = opts.str;\r
+                               }\r
+                               else {\r
+                                       tmp.appendChild(document.createTextNode(opts.str));\r
+                                       document.getElementsByTagName("head")[0].appendChild(tmp);\r
+                               }\r
+                               return tmp.sheet || tmp.styleSheet;\r
+                       }\r
+                       if(opts.url) {\r
+                               if(document.createStyleSheet) {\r
+                                       try { tmp = document.createStyleSheet(opts.url); } catch (e) { }\r
+                               }\r
+                               else {\r
+                                       tmp                     = document.createElement('link');\r
+                                       tmp.rel         = 'stylesheet';\r
+                                       tmp.type        = 'text/css';\r
+                                       tmp.media       = "all";\r
+                                       tmp.href        = opts.url;\r
+                                       document.getElementsByTagName("head")[0].appendChild(tmp);\r
+                                       return tmp.styleSheet;\r
+                               }\r
+                       }\r
+               }\r
+       };\r
+})(jQuery);\r
+\r
+/* \r
+ * jsTree core 1.0\r
+ */\r
+(function ($) {\r
+       // private variables \r
+       var instances = [],                     // instance array (used by $.jstree.reference/create/focused)\r
+               focused_instance = -1,  // the index in the instance array of the currently focused instance\r
+               plugins = {},                   // list of included plugins\r
+               prepared_move = {},             // for the move plugin\r
+               is_ie6 = false;\r
+\r
+       // jQuery plugin wrapper (thanks to jquery UI widget function)\r
+       $.fn.jstree = function (settings) {\r
+               var isMethodCall = (typeof settings == 'string'), // is this a method call like $().jstree("open_node")\r
+                       args = Array.prototype.slice.call(arguments, 1), \r
+                       returnValue = this;\r
+\r
+               // extend settings and allow for multiple hashes and metadata\r
+               if(!isMethodCall && $.meta) { args.push($.metadata.get(this).jstree); }\r
+               settings = !isMethodCall && args.length ? $.extend.apply(null, [true, settings].concat(args)) : settings;\r
+               // block calls to "private" methods\r
+               if(isMethodCall && settings.substring(0, 1) == '_') { return returnValue; }\r
+\r
+               // if a method call execute the method on all selected instances\r
+               if(isMethodCall) {\r
+                       this.each(function() {\r
+                               var instance = instances[$.data(this, "jstree-instance-id")],\r
+                                       methodValue = (instance && $.isFunction(instance[settings])) ? instance[settings].apply(instance, args) : instance;\r
+                                       if(typeof methodValue !== "undefined" && (settings.indexOf("is_" === 0) || (methodValue !== true && methodValue !== false))) { returnValue = methodValue; return false; }\r
+                       });\r
+               }\r
+               else {\r
+                       this.each(function() {\r
+                               var instance_id = $.data(this, "jstree-instance-id"),\r
+                                       s = false;\r
+                               // if an instance already exists, destroy it first\r
+                               if(typeof instance_id !== "undefined" && instances[instance_id]) { instances[instance_id].destroy(); }\r
+                               // push a new empty object to the instances array\r
+                               instance_id = parseInt(instances.push({}),10) - 1;\r
+                               // store the jstree instance id to the container element\r
+                               $.data(this, "jstree-instance-id", instance_id);\r
+                               // clean up all plugins\r
+                               if(!settings) { settings = {}; }\r
+                               settings.plugins = $.isArray(settings.plugins) ? settings.plugins : $.jstree.defaults.plugins;\r
+                               if($.inArray("core", settings.plugins) === -1) { settings.plugins.unshift("core"); }\r
+                               \r
+                               // only unique plugins (NOT WORKING)\r
+                               // settings.plugins = settings.plugins.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");\r
+\r
+                               // extend defaults with passed data\r
+                               s = $.extend(true, {}, $.jstree.defaults, settings);\r
+                               s.plugins = settings.plugins;\r
+                               $.each(plugins, function (i, val) { if($.inArray(i, s.plugins) === -1) { s[i] = null; delete s[i]; } });\r
+                               // push the new object to the instances array (at the same time set the default classes to the container) and init\r
+                               instances[instance_id] = new $.jstree._instance(instance_id, $(this).addClass("jstree jstree-" + instance_id), s); \r
+                               // init all activated plugins for this instance\r
+                               $.each(instances[instance_id]._get_settings().plugins, function (i, val) { instances[instance_id].data[val] = {}; });\r
+                               $.each(instances[instance_id]._get_settings().plugins, function (i, val) { if(plugins[val]) { plugins[val].__init.apply(instances[instance_id]); } });\r
+                               // initialize the instance\r
+                               instances[instance_id].init();\r
+                       });\r
+               }\r
+               // return the jquery selection (or if it was a method call that returned a value - the returned value)\r
+               return returnValue;\r
+       };\r
+       // object to store exposed functions and objects\r
+       $.jstree = {\r
+               defaults : {\r
+                       plugins : []\r
+               },\r
+               _focused : function () { return instances[focused_instance] || null; },\r
+               _reference : function (needle) { \r
+                       // get by instance id\r
+                       if(instances[needle]) { return instances[needle]; }\r
+                       // get by DOM (if still no luck - return null\r
+                       var o = $(needle); \r
+                       if(!o.length && typeof needle === "string") { o = $("#" + needle); }\r
+                       if(!o.length) { return null; }\r
+                       return instances[o.closest(".jstree").data("jstree-instance-id")] || null; \r
+               },\r
+               _instance : function (index, container, settings) { \r
+                       // for plugins to store data in\r
+                       this.data = { core : {} };\r
+                       this.get_settings       = function () { return $.extend(true, {}, settings); };\r
+                       this._get_settings      = function () { return settings; };\r
+                       this.get_index          = function () { return index; };\r
+                       this.get_container      = function () { return container; };\r
+                       this._set_settings      = function (s) { \r
+                               settings = $.extend(true, {}, settings, s);\r
+                       };\r
+               },\r
+               _fn : { },\r
+               plugin : function (pname, pdata) {\r
+                       pdata = $.extend({}, {\r
+                               __init          : $.noop, \r
+                               __destroy       : $.noop,\r
+                               _fn                     : {},\r
+                               defaults        : false\r
+                       }, pdata);\r
+                       plugins[pname] = pdata;\r
+\r
+                       $.jstree.defaults[pname] = pdata.defaults;\r
+                       $.each(pdata._fn, function (i, val) {\r
+                               val.plugin              = pname;\r
+                               val.old                 = $.jstree._fn[i];\r
+                               $.jstree._fn[i] = function () {\r
+                                       var rslt,\r
+                                               func = val,\r
+                                               args = Array.prototype.slice.call(arguments),\r
+                                               evnt = new $.Event("before.jstree"),\r
+                                               rlbk = false;\r
+\r
+                                       // Check if function belongs to the included plugins of this instance\r
+                                       do {\r
+                                               if(func && func.plugin && $.inArray(func.plugin, this._get_settings().plugins) !== -1) { break; }\r
+                                               func = func.old;\r
+                                       } while(func);\r
+                                       if(!func) { return; }\r
+\r
+                                       // a chance to stop execution (or change arguments): \r
+                                       // * just bind to jstree.before\r
+                                       // * check the additional data object (func property)\r
+                                       // * call event.stopImmediatePropagation()\r
+                                       // * return false (or an array of arguments)\r
+                                       rslt = this.get_container().triggerHandler(evnt, { "func" : i, "inst" : this, "args" : args });\r
+                                       if(rslt === false) { return; }\r
+                                       if(typeof rslt !== "undefined") { args = rslt; }\r
+\r
+                                       // context and function to trigger events, then finally call the function\r
+                                       if(i.indexOf("_") === 0) {\r
+                                               rslt = func.apply(this, args);\r
+                                       }\r
+                                       else {\r
+                                               rslt = func.apply(\r
+                                                       $.extend({}, this, { \r
+                                                               __callback : function (data) { \r
+                                                                       this.get_container().triggerHandler( i + '.jstree', { "inst" : this, "args" : args, "rslt" : data, "rlbk" : rlbk });\r
+                                                               },\r
+                                                               __rollback : function () { \r
+                                                                       rlbk = this.get_rollback();\r
+                                                                       return rlbk;\r
+                                                               },\r
+                                                               __call_old : function (replace_arguments) {\r
+                                                                       return func.old.apply(this, (replace_arguments ? Array.prototype.slice.call(arguments, 1) : args ) );\r
+                                                               }\r
+                                                       }), args);\r
+                                       }\r
+\r
+                                       // return the result\r
+                                       return rslt;\r
+                               };\r
+                               $.jstree._fn[i].old = val.old;\r
+                               $.jstree._fn[i].plugin = pname;\r
+                       });\r
+               },\r
+               rollback : function (rb) {\r
+                       if(rb) {\r
+                               if(!$.isArray(rb)) { rb = [ rb ]; }\r
+                               $.each(rb, function (i, val) {\r
+                                       instances[val.i].set_rollback(val.h, val.d);\r
+                               });\r
+                       }\r
+               }\r
+       };\r
+       // set the prototype for all instances\r
+       $.jstree._fn = $.jstree._instance.prototype = {};\r
+\r
+       // css functions - used internally\r
+\r
+       // load the css when DOM is ready\r
+       $(function() {\r
+               // code is copied form jQuery ($.browser is deprecated + there is a bug in IE)\r
+               var u = navigator.userAgent.toLowerCase(),\r
+                       v = (u.match( /.+?(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],\r
+                       css_string = '' + \r
+                               '.jstree ul, .jstree li { display:block; margin:0 0 0 0; padding:0 0 0 0; list-style-type:none; } ' + \r
+                               '.jstree li { display:block; min-height:18px; line-height:18px; white-space:nowrap; margin-left:18px; } ' + \r
+                               '.jstree-rtl li { margin-left:0; margin-right:18px; } ' + \r
+                               '.jstree > ul > li { margin-left:0px; } ' + \r
+                               '.jstree-rtl > ul > li { margin-right:0px; } ' + \r
+                               '.jstree ins { display:inline-block; text-decoration:none; width:18px; height:18px; margin:0 0 0 0; padding:0; } ' + \r
+                               '.jstree a { display:inline-block; line-height:16px; height:16px; color:black; white-space:nowrap; text-decoration:none; padding:1px 2px; margin:0; } ' + \r
+                               '.jstree a:focus { outline: none; } ' + \r
+                               '.jstree a > ins { height:16px; width:16px; } ' + \r
+                               '.jstree a > .jstree-icon { margin-right:3px; } ' + \r
+                               '.jstree-rtl a > .jstree-icon { margin-left:3px; margin-right:0; } ' + \r
+                               'li.jstree-open > ul { display:block; } ' + \r
+                               'li.jstree-closed > ul { display:none; } ';\r
+               // Correct IE 6 (does not support the > CSS selector)\r
+               if(/msie/.test(u) && parseInt(v, 10) == 6) { \r
+                       is_ie6 = true;\r
+                       css_string += '' + \r
+                               '.jstree li { height:18px; margin-left:0; margin-right:0; } ' + \r
+                               '.jstree li li { margin-left:18px; } ' + \r
+                               '.jstree-rtl li li { margin-left:0px; margin-right:18px; } ' + \r
+                               'li.jstree-open ul { display:block; } ' + \r
+                               'li.jstree-closed ul { display:none !important; } ' + \r
+                               '.jstree li a { display:inline; border-width:0 !important; padding:0px 2px !important; } ' + \r
+                               '.jstree li a ins { height:16px; width:16px; margin-right:3px; } ' + \r
+                               '.jstree-rtl li a ins { margin-right:0px; margin-left:3px; } ';\r
+               }\r
+               // Correct IE 7 (shifts anchor nodes onhover)\r
+               if(/msie/.test(u) && parseInt(v, 10) == 7) { \r
+                       css_string += '.jstree li a { border-width:0 !important; padding:0px 2px !important; } ';\r
+               }\r
+               $.vakata.css.add_sheet({ str : css_string });\r
+       });\r
+\r
+       // core functions (open, close, create, update, delete)\r
+       $.jstree.plugin("core", {\r
+               __init : function () {\r
+                       this.data.core.to_open = $.map($.makeArray(this.get_settings().core.initially_open), function (n) { return "#" + n.toString().replace(/^#/,"").replace('\\/','/').replace('/','\\/'); });\r
+               },\r
+               defaults : { \r
+                       html_titles     : false,\r
+                       animation       : 500,\r
+                       initially_open : [],\r
+                       rtl                     : false,\r
+                       strings         : {\r
+                               loading         : "Loading ...",\r
+                               new_node        : "New node"\r
+                       }\r
+               },\r
+               _fn : { \r
+                       init    : function () { \r
+                               this.set_focus(); \r
+                               if(this._get_settings().core.rtl) {\r
+                                       this.get_container().addClass("jstree-rtl").css("direction", "rtl");\r
+                               }\r
+                               this.get_container().html("<ul><li class='jstree-last jstree-leaf'><ins>&#160;</ins><a class='jstree-loading' href='#'><ins class='jstree-icon'>&#160;</ins>" + this._get_settings().core.strings.loading + "</a></li></ul>");\r
+                               this.data.core.li_height = this.get_container().find("ul li.jstree-closed, ul li.jstree-leaf").eq(0).height() || 18;\r
+\r
+                               this.get_container()\r
+                                       .delegate("li > ins", "click.jstree", $.proxy(function (event) {\r
+                                                       var trgt = $(event.target);\r
+                                                       if(trgt.is("ins") && event.pageY - trgt.offset().top < this.data.core.li_height) { this.toggle_node(trgt); }\r
+                                               }, this))\r
+                                       .bind("mousedown.jstree", $.proxy(function () { \r
+                                                       this.set_focus(); // This used to be setTimeout(set_focus,0) - why?\r
+                                               }, this))\r
+                                       .bind("dblclick.jstree", function (event) { \r
+                                               var sel;\r
+                                               if(document.selection && document.selection.empty) { document.selection.empty(); }\r
+                                               else {\r
+                                                       if(window.getSelection) {\r
+                                                               sel = window.getSelection();\r
+                                                               try { \r
+                                                                       sel.removeAllRanges();\r
+                                                                       sel.collapse();\r
+                                                               } catch (err) { }\r
+                                                       }\r
+                                               }\r
+                                       });\r
+                               this.__callback();\r
+                               this.load_node(-1, function () { this.loaded(); this.reopen(); });\r
+                       },\r
+                       destroy : function () { \r
+                               var i,\r
+                                       n = this.get_index(),\r
+                                       s = this._get_settings(),\r
+                                       _this = this;\r
+\r
+                               $.each(s.plugins, function (i, val) {\r
+                                       try { plugins[val].__destroy.apply(_this); } catch(err) { }\r
+                               });\r
+                               this.__callback();\r
+                               // set focus to another instance if this one is focused\r
+                               if(this.is_focused()) { \r
+                                       for(i in instances) { \r
+                                               if(instances.hasOwnProperty(i) && i != n) { \r
+                                                       instances[i].set_focus(); \r
+                                                       break; \r
+                                               } \r
+                                       }\r
+                               }\r
+                               // if no other instance found\r
+                               if(n === focused_instance) { focused_instance = -1; }\r
+                               // remove all traces of jstree in the DOM (only the ones set using jstree*) and cleans all events\r
+                               this.get_container()\r
+                                       .unbind(".jstree")\r
+                                       .undelegate(".jstree")\r
+                                       .removeData("jstree-instance-id")\r
+                                       .find("[class^='jstree']")\r
+                                               .andSelf()\r
+                                               .attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); });\r
+                               // remove the actual data\r
+                               instances[n] = null;\r
+                               delete instances[n];\r
+                       },\r
+                       save_opened : function () {\r
+                               var _this = this;\r
+                               this.data.core.to_open = [];\r
+                               this.get_container().find(".jstree-open").each(function () { \r
+                                       _this.data.core.to_open.push("#" + this.id.toString().replace(/^#/,"").replace('\\/','/').replace('/','\\/')); \r
+                               });\r
+                               this.__callback(_this.data.core.to_open);\r
+                       },\r
+                       reopen : function (is_callback) {\r
+                               var _this = this,\r
+                                       done = true,\r
+                                       current = [],\r
+                                       remaining = [];\r
+                               if(!is_callback) { this.data.core.reopen = false; this.data.core.refreshing = true; }\r
+                               if(this.data.core.to_open.length) {\r
+                                       $.each(this.data.core.to_open, function (i, val) {\r
+                                               if(val == "#") { return true; }\r
+                                               if($(val).length && $(val).is(".jstree-closed")) { current.push(val); }\r
+                                               else { remaining.push(val); }\r
+                                       });\r
+                                       if(current.length) {\r
+                                               this.data.core.to_open = remaining;\r
+                                               $.each(current, function (i, val) { \r
+                                                       _this.open_node(val, function () { _this.reopen(true); }, true); \r
+                                               });\r
+                                               done = false;\r
+                                       }\r
+                               }\r
+                               if(done) { \r
+                                       // TODO: find a more elegant approach to syncronizing returning requests\r
+                                       if(this.data.core.reopen) { clearTimeout(this.data.core.reopen); }\r
+                                       this.data.core.reopen = setTimeout(function () { _this.__callback({}, _this); }, 50);\r
+                                       this.data.core.refreshing = false;\r
+                               }\r
+                       },\r
+                       refresh : function (obj) {\r
+                               var _this = this;\r
+                               this.save_opened();\r
+                               if(!obj) { obj = -1; }\r
+                               obj = this._get_node(obj);\r
+                               if(!obj) { obj = -1; }\r
+                               if(obj !== -1) { obj.children("UL").remove(); }\r
+                               this.load_node(obj, function () { _this.__callback({ "obj" : obj}); _this.reopen(); });\r
+                       },\r
+                       // Dummy function to fire after the first load (so that there is a jstree.loaded event)\r
+                       loaded  : function () { \r
+                               this.__callback(); \r
+                       },\r
+                       // deal with focus\r
+                       set_focus       : function () { \r
+                               var f = $.jstree._focused();\r
+                               if(f && f !== this) {\r
+                                       f.get_container().removeClass("jstree-focused"); \r
+                               }\r
+                               if(f !== this) {\r
+                                       this.get_container().addClass("jstree-focused"); \r
+                                       focused_instance = this.get_index(); \r
+                               }\r
+                               this.__callback();\r
+                       },\r
+                       is_focused      : function () { \r
+                               return focused_instance == this.get_index(); \r
+                       },\r
+\r
+                       // traverse\r
+                       _get_node               : function (obj) { \r
+                               var $obj = $(obj, this.get_container()); \r
+                               if($obj.is(".jstree") || obj == -1) { return -1; } \r
+                               $obj = $obj.closest("li", this.get_container()); \r
+                               return $obj.length ? $obj : false; \r
+                       },\r
+                       _get_next               : function (obj, strict) {\r
+                               obj = this._get_node(obj);\r
+                               if(obj === -1) { return this.get_container().find("> ul > li:first-child"); }\r
+                               if(!obj.length) { return false; }\r
+                               if(strict) { return (obj.nextAll("li").size() > 0) ? obj.nextAll("li:eq(0)") : false; }\r
+\r
+                               if(obj.hasClass("jstree-open")) { return obj.find("li:eq(0)"); }\r
+                               else if(obj.nextAll("li").size() > 0) { return obj.nextAll("li:eq(0)"); }\r
+                               else { return obj.parentsUntil(".jstree","li").next("li").eq(0); }\r
+                       },\r
+                       _get_prev               : function (obj, strict) {\r
+                               obj = this._get_node(obj);\r
+                               if(obj === -1) { return this.get_container().find("> ul > li:last-child"); }\r
+                               if(!obj.length) { return false; }\r
+                               if(strict) { return (obj.prevAll("li").length > 0) ? obj.prevAll("li:eq(0)") : false; }\r
+\r
+                               if(obj.prev("li").length) {\r
+                                       obj = obj.prev("li").eq(0);\r
+                                       while(obj.hasClass("jstree-open")) { obj = obj.children("ul:eq(0)").children("li:last"); }\r
+                                       return obj;\r
+                               }\r
+                               else { var o = obj.parentsUntil(".jstree","li:eq(0)"); return o.length ? o : false; }\r
+                       },\r
+                       _get_parent             : function (obj) {\r
+                               obj = this._get_node(obj);\r
+                               if(obj == -1 || !obj.length) { return false; }\r
+                               var o = obj.parentsUntil(".jstree", "li:eq(0)");\r
+                               return o.length ? o : -1;\r
+                       },\r
+                       _get_children   : function (obj) {\r
+                               obj = this._get_node(obj);\r
+                               if(obj === -1) { return this.get_container().children("ul:eq(0)").children("li"); }\r
+                               if(!obj.length) { return false; }\r
+                               return obj.children("ul:eq(0)").children("li");\r
+                       },\r
+                       get_path                : function (obj, id_mode) {\r
+                               var p = [],\r
+                                       _this = this;\r
+                               obj = this._get_node(obj);\r
+                               if(obj === -1 || !obj || !obj.length) { return false; }\r
+                               obj.parentsUntil(".jstree", "li").each(function () {\r
+                                       p.push( id_mode ? this.id : _this.get_text(this) );\r
+                               });\r
+                               p.reverse();\r
+                               p.push( id_mode ? obj.attr("id") : this.get_text(obj) );\r
+                               return p;\r
+                       },\r
+\r
+                       is_open         : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-open"); },\r
+                       is_closed       : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-closed"); },\r
+                       is_leaf         : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-leaf"); },\r
+                       // open/close\r
+                       open_node       : function (obj, callback, skip_animation) {\r
+                               obj = this._get_node(obj);\r
+                               if(!obj.length) { return false; }\r
+                               if(!obj.hasClass("jstree-closed")) { if(callback) { callback.call(); } return false; }\r
+                               var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation,\r
+                                       t = this;\r
+                               if(!this._is_loaded(obj)) {\r
+                                       obj.children("a").addClass("jstree-loading");\r
+                                       this.load_node(obj, function () { t.open_node(obj, callback, skip_animation); }, callback);\r
+                               }\r
+                               else {\r
+                                       if(s) { obj.children("ul").css("display","none"); }\r
+                                       obj.removeClass("jstree-closed").addClass("jstree-open").children("a").removeClass("jstree-loading");\r
+                                       if(s) { obj.children("ul").stop(true).slideDown(s, function () { this.style.display = ""; }); }\r
+                                       this.__callback({ "obj" : obj });\r
+                                       if(callback) { callback.call(); }\r
+                               }\r
+                       },\r
+                       close_node      : function (obj, skip_animation) {\r
+                               obj = this._get_node(obj);\r
+                               var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation;\r
+                               if(!obj.length || !obj.hasClass("jstree-open")) { return false; }\r
+                               if(s) { obj.children("ul").attr("style","display:block !important"); }\r
+                               obj.removeClass("jstree-open").addClass("jstree-closed");\r
+                               if(s) { obj.children("ul").stop(true).slideUp(s, function () { this.style.display = ""; }); }\r
+                               this.__callback({ "obj" : obj });\r
+                       },\r
+                       toggle_node     : function (obj) {\r
+                               obj = this._get_node(obj);\r
+                               if(obj.hasClass("jstree-closed")) { return this.open_node(obj); }\r
+                               if(obj.hasClass("jstree-open")) { return this.close_node(obj); }\r
+                       },\r
+                       open_all        : function (obj, original_obj) {\r
+                               obj = obj ? this._get_node(obj) : this.get_container();\r
+                               if(!obj || obj === -1) { obj = this.get_container(); }\r
+                               if(original_obj) { \r
+                                       obj = obj.find("li.jstree-closed");\r
+                               }\r
+                               else {\r
+                                       original_obj = obj;\r
+                                       if(obj.is(".jstree-closed")) { obj = obj.find("li.jstree-closed").andSelf(); }\r
+                                       else { obj = obj.find("li.jstree-closed"); }\r
+                               }\r
+                               var _this = this;\r
+                               obj.each(function () { \r
+                                       var __this = this; \r
+                                       if(!_this._is_loaded(this)) { _this.open_node(this, function() { _this.open_all(__this, original_obj); }, true); }\r
+                                       else { _this.open_node(this, false, true); }\r
+                               });\r
+                               // so that callback is fired AFTER all nodes are open\r
+                               if(original_obj.find('li.jstree-closed').length === 0) { this.__callback({ "obj" : original_obj }); }\r
+                       },\r
+                       close_all       : function (obj) {\r
+                               var _this = this;\r
+                               obj = obj ? this._get_node(obj) : this.get_container();\r
+                               if(!obj || obj === -1) { obj = this.get_container(); }\r
+                               obj.find("li.jstree-open").andSelf().each(function () { _this.close_node(this); });\r
+                               this.__callback({ "obj" : obj });\r
+                       },\r
+                       clean_node      : function (obj) {\r
+                               obj = obj && obj != -1 ? $(obj) : this.get_container();\r
+                               obj = obj.is("li") ? obj.find("li").andSelf() : obj.find("li");\r
+                               obj.removeClass("jstree-last")\r
+                                       .filter("li:last-child").addClass("jstree-last").end()\r
+                                       .filter(":has(li)")\r
+                                               .not(".jstree-open").removeClass("jstree-leaf").addClass("jstree-closed");\r
+                               obj.not(".jstree-open, .jstree-closed").addClass("jstree-leaf").children("ul").remove();\r
+                               this.__callback({ "obj" : obj });\r
+                       },\r
+                       // rollback\r
+                       get_rollback : function () { \r
+                               this.__callback();\r
+                               return { i : this.get_index(), h : this.get_container().children("ul").clone(true), d : this.data }; \r
+                       },\r
+                       set_rollback : function (html, data) {\r
+                               this.get_container().empty().append(html);\r
+                               this.data = data;\r
+                               this.__callback();\r
+                       },\r
+                       // Dummy functions to be overwritten by any datastore plugin included\r
+                       load_node       : function (obj, s_call, e_call) { this.__callback({ "obj" : obj }); },\r
+                       _is_loaded      : function (obj) { return true; },\r
+\r
+                       // Basic operations: create\r
+                       create_node     : function (obj, position, js, callback, is_loaded) {\r
+                               obj = this._get_node(obj);\r
+                               position = typeof position === "undefined" ? "last" : position;\r
+                               var d = $("<li>"),\r
+                                       s = this._get_settings().core,\r
+                                       tmp;\r
+\r
+                               if(obj !== -1 && !obj.length) { return false; }\r
+                               if(!is_loaded && !this._is_loaded(obj)) { this.load_node(obj, function () { this.create_node(obj, position, js, callback, true); }); return false; }\r
+\r
+                               this.__rollback();\r
+\r
+                               if(typeof js === "string") { js = { "data" : js }; }\r
+                               if(!js) { js = {}; }\r
+                               if(js.attr) { d.attr(js.attr); }\r
+                               if(js.state) { d.addClass("jstree-" + js.state); }\r
+                               if(!js.data) { js.data = s.strings.new_node; }\r
+                               if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); }\r
+                               $.each(js.data, function (i, m) {\r
+                                       tmp = $("<a>");\r
+                                       if($.isFunction(m)) { m = m.call(this, js); }\r
+                                       if(typeof m == "string") { tmp.attr('href','#')[ s.html_titles ? "html" : "text" ](m); }\r
+                                       else {\r
+                                               if(!m.attr) { m.attr = {}; }\r
+                                               if(!m.attr.href) { m.attr.href = '#'; }\r
+                                               tmp.attr(m.attr)[ s.html_titles ? "html" : "text" ](m.title);\r
+                                               if(m.language) { tmp.addClass(m.language); }\r
+                                       }\r
+                                       tmp.prepend("<ins class='jstree-icon'>&#160;</ins>");\r
+                                       if(m.icon) { \r
+                                               if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); }\r
+                                               else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); }\r
+                                       }\r
+                                       d.append(tmp);\r
+                               });\r
+                               d.prepend("<ins class='jstree-icon'>&#160;</ins>");\r
+                               if(obj === -1) {\r
+                                       obj = this.get_container();\r
+                                       if(position === "before") { position = "first"; }\r
+                                       if(position === "after") { position = "last"; }\r
+                               }\r
+                               switch(position) {\r
+                                       case "before": obj.before(d); tmp = this._get_parent(obj); break;\r
+                                       case "after" : obj.after(d);  tmp = this._get_parent(obj); break;\r
+                                       case "inside":\r
+                                       case "first" :\r
+                                               if(!obj.children("ul").length) { obj.append("<ul>"); }\r
+                                               obj.children("ul").prepend(d);\r
+                                               tmp = obj;\r
+                                               break;\r
+                                       case "last":\r
+                                               if(!obj.children("ul").length) { obj.append("<ul>"); }\r
+                                               obj.children("ul").append(d);\r
+                                               tmp = obj;\r
+                                               break;\r
+                                       default:\r
+                                               if(!obj.children("ul").length) { obj.append("<ul>"); }\r
+                                               if(!position) { position = 0; }\r
+                                               tmp = obj.children("ul").children("li").eq(position);\r
+                                               if(tmp.length) { tmp.before(d); }\r
+                                               else { obj.children("ul").append(d); }\r
+                                               tmp = obj;\r
+                                               break;\r
+                               }\r
+                               if(tmp === -1 || tmp.get(0) === this.get_container().get(0)) { tmp = -1; }\r
+                               this.clean_node(tmp);\r
+                               this.__callback({ "obj" : d, "parent" : tmp });\r
+                               if(callback) { callback.call(this, d); }\r
+                               return d;\r
+                       },\r
+                       // Basic operations: rename (deal with text)\r
+                       get_text        : function (obj) {\r
+                               obj = this._get_node(obj);\r
+                               if(!obj.length) { return false; }\r
+                               var s = this._get_settings().core.html_titles;\r
+                               obj = obj.children("a:eq(0)");\r
+                               if(s) {\r
+                                       obj = obj.clone();\r
+                                       obj.children("INS").remove();\r
+                                       return obj.html();\r
+                               }\r
+                               else {\r
+                                       obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];\r
+                                       return obj.nodeValue;\r
+                               }\r
+                       },\r
+                       set_text        : function (obj, val) {\r
+                               obj = this._get_node(obj);\r
+                               if(!obj.length) { return false; }\r
+                               obj = obj.children("a:eq(0)");\r
+                               if(this._get_settings().core.html_titles) {\r
+                                       var tmp = obj.children("INS").clone();\r
+                                       obj.html(val).prepend(tmp);\r
+                                       this.__callback({ "obj" : obj, "name" : val });\r
+                                       return true;\r
+                               }\r
+                               else {\r
+                                       obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];\r
+                                       this.__callback({ "obj" : obj, "name" : val });\r
+                                       return (obj.nodeValue = val);\r
+                               }\r
+                       },\r
+                       rename_node : function (obj, val) {\r
+                               obj = this._get_node(obj);\r
+                               this.__rollback();\r
+                               if(obj && obj.length && this.set_text.apply(this, Array.prototype.slice.call(arguments))) { this.__callback({ "obj" : obj, "name" : val }); }\r
+                       },\r
+                       // Basic operations: deleting nodes\r
+                       delete_node : function (obj) {\r
+                               obj = this._get_node(obj);\r
+                               if(!obj.length) { return false; }\r
+                               this.__rollback();\r
+                               var p = this._get_parent(obj), prev = this._get_prev(obj);\r
+                               obj = obj.remove();\r
+                               if(p !== -1 && p.find("> ul > li").length === 0) {\r
+                                       p.removeClass("jstree-open jstree-closed").addClass("jstree-leaf");\r
+                               }\r
+                               this.clean_node(p);\r
+                               this.__callback({ "obj" : obj, "prev" : prev });\r
+                               return obj;\r
+                       },\r
+                       prepare_move : function (o, r, pos, cb, is_cb) {\r
+                               var p = {};\r
+\r
+                               p.ot = $.jstree._reference(p.o) || this;\r
+                               p.o = p.ot._get_node(o);\r
+                               p.r = r === - 1 ? -1 : this._get_node(r);\r
+                               p.p = (typeof p === "undefined") ? "last" : pos; // TODO: move to a setting\r
+                               if(!is_cb && prepared_move.o && prepared_move.o[0] === p.o[0] && prepared_move.r[0] === p.r[0] && prepared_move.p === p.p) {\r
+                                       this.__callback(prepared_move);\r
+                                       if(cb) { cb.call(this, prepared_move); }\r
+                                       return;\r
+                               }\r
+                               p.ot = $.jstree._reference(p.o) || this;\r
+                               p.rt = r === -1 ? p.ot : $.jstree._reference(p.r) || this;\r
+                               if(p.r === -1) {\r
+                                       p.cr = -1;\r
+                                       switch(p.p) {\r
+                                               case "first":\r
+                                               case "before":\r
+                                               case "inside":\r
+                                                       p.cp = 0; \r
+                                                       break;\r
+                                               case "after":\r
+                                               case "last":\r
+                                                       p.cp = p.rt.get_container().find(" > ul > li").length; \r
+                                                       break;\r
+                                               default:\r
+                                                       p.cp = p.p;\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                               else {\r
+                                       if(!/^(before|after)$/.test(p.p) && !this._is_loaded(p.r)) {\r
+                                               return this.load_node(p.r, function () { this.prepare_move(o, r, pos, cb, true); });\r
+                                       }\r
+                                       switch(p.p) {\r
+                                               case "before":\r
+                                                       p.cp = p.r.index();\r
+                                                       p.cr = p.rt._get_parent(p.r);\r
+                                                       break;\r
+                                               case "after":\r
+                                                       p.cp = p.r.index() + 1;\r
+                                                       p.cr = p.rt._get_parent(p.r);\r
+                                                       break;\r
+                                               case "inside":\r
+                                               case "first":\r
+                                                       p.cp = 0;\r
+                                                       p.cr = p.r;\r
+                                                       break;\r
+                                               case "last":\r
+                                                       p.cp = p.r.find(" > ul > li").length; \r
+                                                       p.cr = p.r;\r
+                                                       break;\r
+                                               default: \r
+                                                       p.cp = p.p;\r
+                                                       p.cr = p.r;\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                               p.np = p.cr == -1 ? p.rt.get_container() : p.cr;\r
+                               p.op = p.ot._get_parent(p.o);\r
+                               p.or = p.np.find(" > ul > li:nth-child(" + (p.cp + 1) + ")");\r
+\r
+                               prepared_move = p;\r
+                               this.__callback(prepared_move);\r
+                               if(cb) { cb.call(this, prepared_move); }\r
+                       },\r
+                       check_move : function () {\r
+                               var obj = prepared_move, ret = true;\r
+                               if(obj.or[0] === obj.o[0]) { return false; }\r
+                               obj.o.each(function () { \r
+                                       if(obj.r.parentsUntil(".jstree").andSelf().filter("li").index(this) !== -1) { ret = false; return false; }\r
+                               });\r
+                               return ret;\r
+                       },\r
+                       move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) {\r
+                               if(!is_prepared) { \r
+                                       return this.prepare_move(obj, ref, position, function (p) {\r
+                                               this.move_node(p, false, false, is_copy, true, skip_check);\r
+                                       });\r
+                               }\r
+                               if(!skip_check && !this.check_move()) { return false; }\r
+\r
+                               this.__rollback();\r
+                               var o = false;\r
+                               if(is_copy) {\r
+                                       o = obj.o.clone();\r
+                                       o.find("*[id]").andSelf().each(function () {\r
+                                               if(this.id) { this.id = "copy_" + this.id; }\r
+                                       });\r
+                               }\r
+                               else { o = obj.o; }\r
+\r
+                               if(obj.or.length) { obj.or.before(o); }\r
+                               else { \r
+                                       if(!obj.np.children("ul").length) { $("<ul>").appendTo(obj.np); }\r
+                                       obj.np.children("ul:eq(0)").append(o); \r
+                               }\r
+\r
+                               try { \r
+                                       obj.ot.clean_node(obj.op);\r
+                                       obj.rt.clean_node(obj.np);\r
+                                       if(!obj.op.find("> ul > li").length) {\r
+                                               obj.op.removeClass("jstree-open jstree-closed").addClass("jstree-leaf").children("ul").remove();\r
+                                       }\r
+                               } catch (e) { }\r
+\r
+                               if(is_copy) { \r
+                                       prepared_move.cy = true;\r
+                                       prepared_move.oc = o; \r
+                               }\r
+                               this.__callback(prepared_move);\r
+                               return prepared_move;\r
+                       },\r
+                       _get_move : function () { return prepared_move; }\r
+               }\r
+       });\r
+})(jQuery);\r
+//*/\r
+\r
+/* \r
+ * jsTree ui plugin 1.0\r
+ * This plugins handles selecting/deselecting/hovering/dehovering nodes\r
+ */\r
+(function ($) {\r
+       $.jstree.plugin("ui", {\r
+               __init : function () { \r
+                       this.data.ui.selected = $(); \r
+                       this.data.ui.last_selected = false; \r
+                       this.data.ui.hovered = null;\r
+                       this.data.ui.to_select = this.get_settings().ui.initially_select;\r
+\r
+                       this.get_container()\r
+                               .delegate("a", "click.jstree", $.proxy(function (event) {\r
+                                               event.preventDefault();\r
+                                               this.select_node(event.currentTarget, true, event);\r
+                                       }, this))\r
+                               .delegate("a", "mouseenter.jstree", $.proxy(function (event) {\r
+                                               this.hover_node(event.target);\r
+                                       }, this))\r
+                               .delegate("a", "mouseleave.jstree", $.proxy(function (event) {\r
+                                               this.dehover_node(event.target);\r
+                                       }, this))\r
+                               .bind("reopen.jstree", $.proxy(function () { \r
+                                               this.reselect();\r
+                                       }, this))\r
+                               .bind("get_rollback.jstree", $.proxy(function () { \r
+                                               this.dehover_node();\r
+                                               this.save_selected();\r
+                                       }, this))\r
+                               .bind("set_rollback.jstree", $.proxy(function () { \r
+                                               this.reselect();\r
+                                       }, this))\r
+                               .bind("close_node.jstree", $.proxy(function (event, data) { \r
+                                               var s = this._get_settings().ui,\r
+                                                       obj = this._get_node(data.rslt.obj),\r
+                                                       clk = (obj && obj.length) ? obj.children("ul").find(".jstree-clicked") : $(),\r
+                                                       _this = this;\r
+                                               if(s.selected_parent_close === false || !clk.length) { return; }\r
+                                               clk.each(function () { \r
+                                                       _this.deselect_node(this);\r
+                                                       if(s.selected_parent_close === "select_parent") { _this.select_node(obj); }\r
+                                               });\r
+                                       }, this))\r
+                               .bind("delete_node.jstree", $.proxy(function (event, data) { \r
+                                               var s = this._get_settings().ui.select_prev_on_delete,\r
+                                                       obj = this._get_node(data.rslt.obj),\r
+                                                       clk = (obj && obj.length) ? obj.find(".jstree-clicked") : [],\r
+                                                       _this = this;\r
+                                               clk.each(function () { _this.deselect_node(this); });\r
+                                               if(s && clk.length) { this.select_node(data.rslt.prev); }\r
+                                       }, this))\r
+                               .bind("move_node.jstree", $.proxy(function (event, data) { \r
+                                               if(data.rslt.cy) { \r
+                                                       data.rslt.oc.find(".jstree-clicked").removeClass("jstree-clicked");\r
+                                               }\r
+                                       }, this));\r
+               },\r
+               defaults : {\r
+                       select_limit : -1, // 0, 1, 2 ... or -1 for unlimited\r
+                       select_multiple_modifier : "ctrl", // on, or ctrl, shift, alt\r
+                       selected_parent_close : "select_parent", // false, "deselect", "select_parent"\r
+                       select_prev_on_delete : true,\r
+                       disable_selecting_children : false,\r
+                       initially_select : []\r
+               },\r
+               _fn : { \r
+                       _get_node : function (obj, allow_multiple) {\r
+                               if(typeof obj === "undefined" || obj === null) { return allow_multiple ? this.data.ui.selected : this.data.ui.last_selected; }\r
+                               var $obj = $(obj, this.get_container()); \r
+                               if($obj.is(".jstree") || obj == -1) { return -1; } \r
+                               $obj = $obj.closest("li", this.get_container()); \r
+                               return $obj.length ? $obj : false; \r
+                       },\r
+                       save_selected : function () {\r
+                               var _this = this;\r
+                               this.data.ui.to_select = [];\r
+                               this.data.ui.selected.each(function () { _this.data.ui.to_select.push("#" + this.id.toString().replace(/^#/,"").replace('\\/','/').replace('/','\\/')); });\r
+                               this.__callback(this.data.ui.to_select);\r
+                       },\r
+                       reselect : function () {\r
+                               var _this = this,\r
+                                       s = this.data.ui.to_select;\r
+                               s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace('\\/','/').replace('/','\\/'); });\r
+                               this.deselect_all();\r
+                               $.each(s, function (i, val) { if(val && val !== "#") { _this.select_node(val); } });\r
+                               this.__callback();\r
+                       },\r
+                       refresh : function (obj) {\r
+                               this.save_selected();\r
+                               return this.__call_old();\r
+                       },\r
+                       hover_node : function (obj) {\r
+                               obj = this._get_node(obj);\r
+                               if(!obj.length) { return false; }\r
+                               //if(this.data.ui.hovered && obj.get(0) === this.data.ui.hovered.get(0)) { return; }\r
+                               if(!obj.hasClass("jstree-hovered")) { this.dehover_node(); }\r
+                               this.data.ui.hovered = obj.children("a").addClass("jstree-hovered").parent();\r
+                               this.__callback({ "obj" : obj });\r
+                       },\r
+                       dehover_node : function () {\r
+                               var obj = this.data.ui.hovered, p;\r
+                               if(!obj || !obj.length) { return false; }\r
+                               p = obj.children("a").removeClass("jstree-hovered").parent();\r
+                               if(this.data.ui.hovered[0] === p[0]) { this.data.ui.hovered = null; }\r
+                               this.__callback({ "obj" : obj });\r
+                       },\r
+                       select_node : function (obj, check, e) {\r
+                               obj = this._get_node(obj);\r
+                               if(obj == -1 || !obj || !obj.length) { return false; }\r
+                               var s = this._get_settings().ui,\r
+                                       is_multiple = (s.select_multiple_modifier == "on" || (s.select_multiple_modifier !== false && e && e[s.select_multiple_modifier + "Key"])),\r
+                                       is_selected = this.is_selected(obj),\r
+                                       proceed = true;\r
+                               if(check) {\r
+                                       if(s.disable_selecting_children && is_multiple && obj.parents("li", this.get_container()).children(".jstree-clicked").length) {\r
+                                               return false;\r
+                                       }\r
+                                       proceed = false;\r
+                                       switch(!0) {\r
+                                               case (is_selected && !is_multiple): \r
+                                                       this.deselect_all();\r
+                                                       is_selected = false;\r
+                                                       proceed = true;\r
+                                                       break;\r
+                                               case (!is_selected && !is_multiple): \r
+                                                       if(s.select_limit == -1 || s.select_limit > 0) {\r
+                                                               this.deselect_all();\r
+                                                               proceed = true;\r
+                                                       }\r
+                                                       break;\r
+                                               case (is_selected && is_multiple): \r
+                                                       this.deselect_node(obj);\r
+                                                       break;\r
+                                               case (!is_selected && is_multiple): \r
+                                                       if(s.select_limit == -1 || this.data.ui.selected.length + 1 <= s.select_limit) { \r
+                                                               proceed = true;\r
+                                                       }\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                               if(proceed && !is_selected) {\r
+                                       obj.children("a").addClass("jstree-clicked");\r
+                                       this.data.ui.selected = this.data.ui.selected.add(obj);\r
+                                       this.data.ui.last_selected = obj;\r
+                                       this.__callback({ "obj" : obj });\r
+                               }\r
+                       },\r
+                       deselect_node : function (obj) {\r
+                               obj = this._get_node(obj);\r
+                               if(!obj.length) { return false; }\r
+                               if(this.is_selected(obj)) {\r
+                                       obj.children("a").removeClass("jstree-clicked");\r
+                                       this.data.ui.selected = this.data.ui.selected.not(obj);\r
+                                       if(this.data.ui.last_selected.get(0) === obj.get(0)) { this.data.ui.last_selected = this.data.ui.selected.eq(0); }\r
+                                       this.__callback({ "obj" : obj });\r
+                               }\r
+                       },\r
+                       toggle_select : function (obj) {\r
+                               obj = this._get_node(obj);\r
+                               if(!obj.length) { return false; }\r
+                               if(this.is_selected(obj)) { this.deselect_node(obj); }\r
+                               else { this.select_node(obj); }\r
+                       },\r
+                       is_selected : function (obj) { return this.data.ui.selected.index(this._get_node(obj)) >= 0; },\r
+                       get_selected : function (context) { \r
+                               return context ? $(context).find(".jstree-clicked").parent() : this.data.ui.selected; \r
+                       },\r
+                       deselect_all : function (context) {\r
+                               if(context) { $(context).find(".jstree-clicked").removeClass("jstree-clicked"); } \r
+                               else { this.get_container().find(".jstree-clicked").removeClass("jstree-clicked"); }\r
+                               this.data.ui.selected = $([]);\r
+                               this.data.ui.last_selected = false;\r
+                               this.__callback();\r
+                       }\r
+               }\r
+       });\r
+       // include the selection plugin by default\r
+       $.jstree.defaults.plugins.push("ui");\r
+})(jQuery);\r
+//*/\r
+\r
+/* \r
+ * jsTree CRRM plugin 1.0\r
+ * Handles creating/renaming/removing/moving nodes by user interaction.\r
+ */\r
+(function ($) {\r
+       $.jstree.plugin("crrm", { \r
+               __init : function () {\r
+                       this.get_container()\r
+                               .bind("move_node.jstree", $.proxy(function (e, data) {\r
+                                       if(this._get_settings().crrm.move.open_onmove) {\r
+                                               var t = this;\r
+                                               data.rslt.np.parentsUntil(".jstree").andSelf().filter(".jstree-closed").each(function () {\r
+                                                       t.open_node(this, false, true);\r
+                                               });\r
+                                       }\r
+                               }, this));\r
+               },\r
+               defaults : {\r
+                       input_width_limit : 200,\r
+                       move : {\r
+                               always_copy                     : false, // false, true or "multitree"\r
+                               open_onmove                     : true,\r
+                               default_position        : "last",\r
+                               check_move                      : function (m) { return true; }\r
+                       }\r
+               },\r
+               _fn : {\r
+                       _show_input : function (obj, callback) {\r
+                               obj = this._get_node(obj);\r
+                               var rtl = this._get_settings().core.rtl,\r
+                                       w = this._get_settings().crrm.input_width_limit,\r
+                                       w1 = obj.children("ins").width(),\r
+                                       w2 = obj.find("> a:visible > ins").width() * obj.find("> a:visible > ins").length,\r
+                                       t = this.get_text(obj),\r
+                                       h1 = $("<div>", { css : { "position" : "absolute", "top" : "-200px", "left" : (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo("body"),\r
+                                       h2 = obj.css("position","relative").append(\r
+                                       $("<input>", { \r
+                                               "value" : t,\r
+                                               // "size" : t.length,\r
+                                               "css" : {\r
+                                                       "padding" : "0",\r
+                                                       "border" : "1px solid silver",\r
+                                                       "position" : "absolute",\r
+                                                       "left"  : (rtl ? "auto" : (w1 + w2 + 4) + "px"),\r
+                                                       "right" : (rtl ? (w1 + w2 + 4) + "px" : "auto"),\r
+                                                       "top" : "0px",\r
+                                                       "height" : (this.data.core.li_height - 2) + "px",\r
+                                                       "lineHeight" : (this.data.core.li_height - 2) + "px",\r
+                                                       "width" : "150px" // will be set a bit further down\r
+                                               },\r
+                                               "blur" : $.proxy(function () {\r
+                                                       var i = obj.children("input"),\r
+                                                               v = i.val();\r
+                                                       if(v === "") { v = t; }\r
+                                                       i.remove(); // rollback purposes\r
+                                                       this.set_text(obj,t); // rollback purposes\r
+                                                       this.rename_node(obj, v);\r
+                                                       callback.call(this, obj, v, t);\r
+                                                       obj.css("position","");\r
+                                               }, this),\r
+                                               "keyup" : function (event) {\r
+                                                       var key = event.keyCode || event.which;\r
+                                                       if(key == 27) { this.value = t; this.blur(); return; }\r
+                                                       else if(key == 13) { this.blur(); return; }\r
+                                                       else {\r
+                                                               h2.width(Math.min(h1.text("pW" + this.value).width(),w));\r
+                                                       }\r
+                                               }\r
+                                       })\r
+                               ).children("input"); \r
+                               this.set_text(obj, "");\r
+                               h1.css({\r
+                                               fontFamily              : h2.css('fontFamily')          || '',\r
+                                               fontSize                : h2.css('fontSize')            || '',\r
+                                               fontWeight              : h2.css('fontWeight')          || '',\r
+                                               fontStyle               : h2.css('fontStyle')           || '',\r
+                                               fontStretch             : h2.css('fontStretch')         || '',\r
+                                               fontVariant             : h2.css('fontVariant')         || '',\r
+                                               letterSpacing   : h2.css('letterSpacing')       || '',\r
+                                               wordSpacing             : h2.css('wordSpacing')         || ''\r
+                               });\r
+                               h2.width(Math.min(h1.text("pW" + h2[0].value).width(),w))[0].select();\r
+                       },\r
+                       rename : function (obj) {\r
+                               obj = this._get_node(obj);\r
+                               this.__rollback();\r
+                               var f = this.__callback;\r
+                               this._show_input(obj, function (obj, new_name, old_name) { \r
+                                       f.call(this, { "obj" : obj, "new_name" : new_name, "old_name" : old_name });\r
+                               });\r
+                       },\r
+                       create : function (obj, position, js, callback, skip_rename) {\r
+                               var t, _this = this;\r
+                               obj = this._get_node(obj);\r
+                               if(!obj) { obj = -1; }\r
+                               this.__rollback();\r
+                               t = this.create_node(obj, position, js, function (t) {\r
+                                       var p = this._get_parent(t),\r
+                                               pos = $(t).index();\r
+                                       if(callback) { callback.call(this, t); }\r
+                                       if(p.length && p.hasClass("jstree-closed")) { this.open_node(p, false, true); }\r
+                                       if(!skip_rename) { \r
+                                               this._show_input(t, function (obj, new_name, old_name) { \r
+                                                       _this.__callback({ "obj" : obj, "name" : new_name, "parent" : p, "position" : pos });\r
+                                               });\r
+                                       }\r
+                                       else { _this.__callback({ "obj" : t, "name" : this.get_text(t), "parent" : p, "position" : pos }); }\r
+                               });\r
+                               return t;\r
+                       },\r
+                       remove : function (obj) {\r
+                               obj = this._get_node(obj, true);\r
+                               this.__rollback();\r
+                               this.delete_node(obj);\r
+                               this.__callback({ "obj" : obj });\r
+                       },\r
+                       check_move : function () {\r
+                               if(!this.__call_old()) { return false; }\r
+                               var s = this._get_settings().crrm.move;\r
+                               if(!s.check_move.call(this, this._get_move())) { return false; }\r
+                               return true;\r
+                       },\r
+                       move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) {\r
+                               var s = this._get_settings().crrm.move;\r
+                               if(!is_prepared) { \r
+                                       if(!position) { position = s.default_position; }\r
+                                       if(position === "inside" && !s.default_position.match(/^(before|after)$/)) { position = s.default_position; }\r
+                                       return this.__call_old(true, obj, ref, position, is_copy, false, skip_check);\r
+                               }\r
+                               // if the move is already prepared\r
+                               if(s.always_copy === true || (s.always_copy === "multitree" && obj.rt.get_index() !== obj.ot.get_index() )) {\r
+                                       is_copy = true;\r
+                               }\r
+                               this.__call_old(true, obj, ref, position, is_copy, true, skip_check);\r
+                       },\r
+\r
+                       cut : function (obj) {\r
+                               obj = this._get_node(obj);\r
+                               this.data.crrm.cp_nodes = false;\r
+                               this.data.crrm.ct_nodes = false;\r
+                               if(!obj || !obj.length) { return false; }\r
+                               this.data.crrm.ct_nodes = obj;\r
+                       },\r
+                       copy : function (obj) {\r
+                               obj = this._get_node(obj);\r
+                               this.data.crrm.cp_nodes = false;\r
+                               this.data.crrm.ct_nodes = false;\r
+                               if(!obj || !obj.length) { return false; }\r
+                               this.data.crrm.cp_nodes = obj;\r
+                       },\r
+                       paste : function (obj) { \r
+                               obj = this._get_node(obj);\r
+                               if(!obj || !obj.length) { return false; }\r
+                               if(!this.data.crrm.ct_nodes && !this.data.crrm.cp_nodes) { return false; }\r
+                               if(this.data.crrm.ct_nodes) { this.move_node(this.data.crrm.ct_nodes, obj); }\r
+                               if(this.data.crrm.cp_nodes) { this.move_node(this.data.crrm.cp_nodes, obj, false, true); }\r
+                               this.data.crrm.cp_nodes = false;\r
+                               this.data.crrm.ct_nodes = false;\r
+                       }\r
+               }\r
+       });\r
+       // include the crr plugin by default\r
+       $.jstree.defaults.plugins.push("crrm");\r
+})(jQuery);\r
+\r
+/* \r
+ * jsTree themes plugin 1.0\r
+ * Handles loading and setting themes, as well as detecting path to themes, etc.\r
+ */\r
+(function ($) {\r
+       var themes_loaded = [];\r
+       // this variable stores the path to the themes folder - if left as false - it will be autodetected\r
+       $.jstree._themes = false;\r
+       $.jstree.plugin("themes", {\r
+               __init : function () { \r
+                       this.get_container()\r
+                               .bind("init.jstree", $.proxy(function () {\r
+                                               var s = this._get_settings().themes;\r
+                                               this.data.themes.dots = s.dots; \r
+                                               this.data.themes.icons = s.icons; \r
+                                               //alert(s.dots);\r
+                                               this.set_theme(s.theme, s.url);\r
+                                       }, this))\r
+                               .bind("loaded.jstree", $.proxy(function () {\r
+                                               // bound here too, as simple HTML tree's won't honor dots & icons otherwise\r
+                                               if(!this.data.themes.dots) { this.hide_dots(); }\r
+                                               else { this.show_dots(); }\r
+                                               if(!this.data.themes.icons) { this.hide_icons(); }\r
+                                               else { this.show_icons(); }\r
+                                       }, this));\r
+               },\r
+               defaults : { \r
+                       theme : "default", \r
+                       url : false,\r
+                       dots : true,\r
+                       icons : true\r
+               },\r
+               _fn : {\r
+                       set_theme : function (theme_name, theme_url) {\r
+                               if(!theme_name) { return false; }\r
+                               if(!theme_url) { theme_url = $.jstree._themes + theme_name + '/style.css'; }\r
+                               if($.inArray(theme_url, themes_loaded) == -1) {\r
+                                       $.vakata.css.add_sheet({ "url" : theme_url, "rel" : "jstree" });\r
+                                       themes_loaded.push(theme_url);\r
+                               }\r
+                               if(this.data.themes.theme != theme_name) {\r
+                                       this.get_container().removeClass('jstree-' + this.data.themes.theme);\r
+                                       this.data.themes.theme = theme_name;\r
+                               }\r
+                               this.get_container().addClass('jstree-' + theme_name);\r
+                               if(!this.data.themes.dots) { this.hide_dots(); }\r
+                               else { this.show_dots(); }\r
+                               if(!this.data.themes.icons) { this.hide_icons(); }\r
+                               else { this.show_icons(); }\r
+                               this.__callback();\r
+                       },\r
+                       get_theme       : function () { return this.data.themes.theme; },\r
+\r
+                       show_dots       : function () { this.data.themes.dots = true; this.get_container().children("ul").removeClass("jstree-no-dots"); },\r
+                       hide_dots       : function () { this.data.themes.dots = false; this.get_container().children("ul").addClass("jstree-no-dots"); },\r
+                       toggle_dots     : function () { if(this.data.themes.dots) { this.hide_dots(); } else { this.show_dots(); } },\r
+\r
+                       show_icons      : function () { this.data.themes.icons = true; this.get_container().children("ul").removeClass("jstree-no-icons"); },\r
+                       hide_icons      : function () { this.data.themes.icons = false; this.get_container().children("ul").addClass("jstree-no-icons"); },\r
+                       toggle_icons: function () { if(this.data.themes.icons) { this.hide_icons(); } else { this.show_icons(); } }\r
+               }\r
+       });\r
+       // autodetect themes path\r
+       $(function () {\r
+               if($.jstree._themes === false) {\r
+                       $("script").each(function () { \r
+                               if(this.src.toString().match(/jquery\.jstree[^\/]*?\.js(\?.*)?$/)) { \r
+                                       $.jstree._themes = this.src.toString().replace(/jquery\.jstree[^\/]*?\.js(\?.*)?$/, "") + 'themes/'; \r
+                                       return false; \r
+                               }\r
+                       });\r
+               }\r
+               if($.jstree._themes === false) { $.jstree._themes = "themes/"; }\r
+       });\r
+       // include the themes plugin by default\r
+       $.jstree.defaults.plugins.push("themes");\r
+})(jQuery);\r
+//*/\r
+\r
+/*\r
+ * jsTree hotkeys plugin 1.0\r
+ * Enables keyboard navigation for all tree instances\r
+ * Depends on the jstree ui & jquery hotkeys plugins\r
+ */\r
+(function ($) {\r
+       var bound = [];\r
+       function exec(i, event) {\r
+               var f = $.jstree._focused(), tmp;\r
+               if(f && f.data && f.data.hotkeys && f.data.hotkeys.enabled) { \r
+                       tmp = f._get_settings().hotkeys[i];\r
+                       if(tmp) { return tmp.call(f, event); }\r
+               }\r
+       }\r
+       $.jstree.plugin("hotkeys", {\r
+               __init : function () {\r
+                       if(typeof $.hotkeys === "undefined") { throw "jsTree hotkeys: jQuery hotkeys plugin not included."; }\r
+                       if(!this.data.ui) { throw "jsTree hotkeys: jsTree UI plugin not included."; }\r
+                       $.each(this._get_settings().hotkeys, function (i, val) {\r
+                               if($.inArray(i, bound) == -1) {\r
+                                       $(document).bind("keydown", i, function (event) { return exec(i, event); });\r
+                                       bound.push(i);\r
+                               }\r
+                       });\r
+                       this.enable_hotkeys();\r
+               },\r
+               defaults : {\r
+                       "up" : function () { \r
+                               var o = this.data.ui.hovered || this.data.ui.last_selected || -1;\r
+                               this.hover_node(this._get_prev(o));\r
+                               return false; \r
+                       },\r
+                       "down" : function () { \r
+                               var o = this.data.ui.hovered || this.data.ui.last_selected || -1;\r
+                               this.hover_node(this._get_next(o));\r
+                               return false;\r
+                       },\r
+                       "left" : function () { \r
+                               var o = this.data.ui.hovered || this.data.ui.last_selected;\r
+                               if(o) {\r
+                                       if(o.hasClass("jstree-open")) { this.close_node(o); }\r
+                                       else { this.hover_node(this._get_prev(o)); }\r
+                               }\r
+                               return false;\r
+                       },\r
+                       "right" : function () { \r
+                               var o = this.data.ui.hovered || this.data.ui.last_selected;\r
+                               if(o && o.length) {\r
+                                       if(o.hasClass("jstree-closed")) { this.open_node(o); }\r
+                                       else { this.hover_node(this._get_next(o)); }\r
+                               }\r
+                               return false;\r
+                       },\r
+                       "space" : function () { \r
+                               if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").click(); } \r
+                               return false; \r
+                       },\r
+                       "ctrl+space" : function (event) { \r
+                               event.type = "click";\r
+                               if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").trigger(event); } \r
+                               return false; \r
+                       },\r
+                       "f2" : function () { this.rename(this.data.ui.hovered || this.data.ui.last_selected); },\r
+                       "del" : function () { this.remove(this.data.ui.hovered || this._get_node(null)); }\r
+               },\r
+               _fn : {\r
+                       enable_hotkeys : function () {\r
+                               this.data.hotkeys.enabled = true;\r
+                       },\r
+                       disable_hotkeys : function () {\r
+                               this.data.hotkeys.enabled = false;\r
+                       }\r
+               }\r
+       });\r
+})(jQuery);\r
+//*/\r
+\r
+/* \r
+ * jsTree JSON 1.0\r
+ * The JSON data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions.\r
+ */\r
+(function ($) {\r
+       $.jstree.plugin("json_data", {\r
+               defaults : { \r
+                       data : false,\r
+                       ajax : false,\r
+                       correct_state : true,\r
+                       progressive_render : false\r
+               },\r
+               _fn : {\r
+                       load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_json(obj, function () { _this.__callback({ "obj" : obj }); s_call.call(this); }, e_call); },\r
+                       _is_loaded : function (obj) { \r
+                               var s = this._get_settings().json_data, d;\r
+                               obj = this._get_node(obj); \r
+                               if(obj && obj !== -1 && s.progressive_render && !obj.is(".jstree-open, .jstree-leaf") && obj.children("ul").children("li").length === 0 && obj.data("jstree-children")) {\r
+                                       d = this._parse_json(obj.data("jstree-children"));\r
+                                       if(d) {\r
+                                               obj.append(d);\r
+                                               $.removeData(obj, "jstree-children");\r
+                                       }\r
+                                       this.clean_node(obj);\r
+                                       return true;\r
+                               }\r
+                               return obj == -1 || !obj || !s.ajax || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;\r
+                       },\r
+                       load_node_json : function (obj, s_call, e_call) {\r
+                               var s = this.get_settings().json_data, d,\r
+                                       error_func = function () {},\r
+                                       success_func = function () {};\r
+                               obj = this._get_node(obj);\r
+                               if(obj && obj !== -1) {\r
+                                       if(obj.data("jstree-is-loading")) { return; }\r
+                                       else { obj.data("jstree-is-loading",true); }\r
+                               }\r
+                               switch(!0) {\r
+                                       case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied.";\r
+                                       case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):\r
+                                               if(!obj || obj == -1) {\r
+                                                       d = this._parse_json(s.data);\r
+                                                       if(d) {\r
+                                                               this.get_container().children("ul").empty().append(d.children());\r
+                                                               this.clean_node();\r
+                                                       }\r
+                                                       else { \r
+                                                               if(s.correct_state) { this.get_container().children("ul").empty(); }\r
+                                                       }\r
+                                               }\r
+                                               if(s_call) { s_call.call(this); }\r
+                                               break;\r
+                                       case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):\r
+                                               error_func = function (x, t, e) {\r
+                                                       var ef = this.get_settings().json_data.ajax.error; \r
+                                                       if(ef) { ef.call(this, x, t, e); }\r
+                                                       if(obj != -1 && obj.length) {\r
+                                                               obj.children(".jstree-loading").removeClass("jstree-loading");\r
+                                                               obj.data("jstree-is-loading",false);\r
+                                                               if(t === "success" && s.correct_state) { obj.removeClass("jstree-open jstree-closed").addClass("jstree-leaf"); }\r
+                                                       }\r
+                                                       else {\r
+                                                               if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }\r
+                                                       }\r
+                                                       if(e_call) { e_call.call(this); }\r
+                                               };\r
+                                               success_func = function (d, t, x) {\r
+                                                       var sf = this.get_settings().json_data.ajax.success; \r
+                                                       if(sf) { d = sf.call(this,d,t,x) || d; }\r
+                                                       if(d === "" || (!$.isArray(d) && !$.isPlainObject(d))) {\r
+                                                               return error_func.call(this, x, t, "");\r
+                                                       }\r
+                                                       d = this._parse_json(d);\r
+                                                       if(d) {\r
+                                                               if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }\r
+                                                               else { obj.append(d).children(".jstree-loading").removeClass("jstree-loading"); obj.data("jstree-is-loading",false); }\r
+                                                               this.clean_node(obj);\r
+                                                               if(s_call) { s_call.call(this); }\r
+                                                       }\r
+                                                       else {\r
+                                                               if(obj === -1 || !obj) {\r
+                                                                       if(s.correct_state) { \r
+                                                                               this.get_container().children("ul").empty(); \r
+                                                                               if(s_call) { s_call.call(this); }\r
+                                                                       }\r
+                                                               }\r
+                                                               else {\r
+                                                                       obj.children(".jstree-loading").removeClass("jstree-loading");\r
+                                                                       obj.data("jstree-is-loading",false);\r
+                                                                       if(s.correct_state) { \r
+                                                                               obj.removeClass("jstree-open jstree-closed").addClass("jstree-leaf"); \r
+                                                                               if(s_call) { s_call.call(this); } \r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                               };\r
+                                               s.ajax.context = this;\r
+                                               s.ajax.error = error_func;\r
+                                               s.ajax.success = success_func;\r
+                                               if(!s.ajax.dataType) { s.ajax.dataType = "json"; }\r
+                                               if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }\r
+                                               if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }\r
+                                               $.ajax(s.ajax);\r
+                                               break;\r
+                               }\r
+                       },\r
+                       _parse_json : function (js, is_callback) {\r
+                               var d = false, \r
+                                       p = this._get_settings(),\r
+                                       s = p.json_data,\r
+                                       t = p.core.html_titles,\r
+                                       tmp, i, j, ul1, ul2;\r
+\r
+                               if(!js) { return d; }\r
+                               if($.isFunction(js)) { \r
+                                       js = js.call(this);\r
+                               }\r
+                               if($.isArray(js)) {\r
+                                       d = $();\r
+                                       if(!js.length) { return false; }\r
+                                       for(i = 0, j = js.length; i < j; i++) {\r
+                                               tmp = this._parse_json(js[i], true);\r
+                                               if(tmp.length) { d = d.add(tmp); }\r
+                                       }\r
+                               }\r
+                               else {\r
+                                       if(typeof js == "string") { js = { data : js }; }\r
+                                       if(!js.data && js.data !== "") { return d; }\r
+                                       d = $("<li>");\r
+                                       if(js.attr) { d.attr(js.attr); }\r
+                                       if(js.metadata) { d.data("jstree", js.metadata); }\r
+                                       if(js.state) { d.addClass("jstree-" + js.state); }\r
+                                       if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); }\r
+                                       $.each(js.data, function (i, m) {\r
+                                               tmp = $("<a>");\r
+                                               if($.isFunction(m)) { m = m.call(this, js); }\r
+                                               if(typeof m == "string") { tmp.attr('href','#')[ t ? "html" : "text" ](m); }\r
+                                               else {\r
+                                                       if(!m.attr) { m.attr = {}; }\r
+                                                       if(!m.attr.href) { m.attr.href = '#'; }\r
+                                                       tmp.attr(m.attr)[ t ? "html" : "text" ](m.title);\r
+                                                       if(m.language) { tmp.addClass(m.language); }\r
+                                               }\r
+                                               tmp.prepend("<ins class='jstree-icon'>&#160;</ins>");\r
+                                               if(!m.icon && js.icon) { m.icon = js.icon; }\r
+                                               if(m.icon) { \r
+                                                       if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); }\r
+                                                       else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); }\r
+                                               }\r
+                                               d.append(tmp);\r
+                                       });\r
+                                       d.prepend("<ins class='jstree-icon'>&#160;</ins>");\r
+                                       if(js.children) { \r
+                                               if(s.progressive_render && js.state !== "open") {\r
+                                                       d.addClass("jstree-closed").data("jstree-children", js.children);\r
+                                               }\r
+                                               else {\r
+                                                       if($.isFunction(js.children)) {\r
+                                                               js.children = js.children.call(this, js);\r
+                                                       }\r
+                                                       if($.isArray(js.children) && js.children.length) {\r
+                                                               tmp = this._parse_json(js.children, true);\r
+                                                               if(tmp.length) {\r
+                                                                       ul2 = $("<ul>");\r
+                                                                       ul2.append(tmp);\r
+                                                                       d.append(ul2);\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                               if(!is_callback) {\r
+                                       ul1 = $("<ul>");\r
+                                       ul1.append(d);\r
+                                       d = ul1;\r
+                               }\r
+                               return d;\r
+                       },\r
+                       get_json : function (obj, li_attr, a_attr, is_callback) {\r
+                               var result = [], \r
+                                       s = this._get_settings(), \r
+                                       _this = this,\r
+                                       tmp1, tmp2, li, a, t, lang;\r
+                               obj = this._get_node(obj);\r
+                               if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); }\r
+                               li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ];\r
+                               if(!is_callback && this.data.types) { li_attr.push(s.types.type_attr); }\r
+                               a_attr = $.isArray(a_attr) ? a_attr : [ ];\r
+\r
+                               obj.each(function () {\r
+                                       li = $(this);\r
+                                       tmp1 = { data : [] };\r
+                                       if(li_attr.length) { tmp1.attr = { }; }\r
+                                       $.each(li_attr, function (i, v) { \r
+                                               tmp2 = li.attr(v); \r
+                                               if(tmp2 && tmp2.length && tmp2.replace(/jstree[^ ]*|$/ig,'').length) {\r
+                                                       tmp1.attr[v] = tmp2.replace(/jstree[^ ]*|$/ig,''); \r
+                                               }\r
+                                       });\r
+                                       if(li.hasClass("jstree-open")) { tmp1.state = "open"; }\r
+                                       if(li.hasClass("jstree-closed")) { tmp1.state = "closed"; }\r
+                                       a = li.children("a");\r
+                                       a.each(function () {\r
+                                               t = $(this);\r
+                                               if(\r
+                                                       a_attr.length || \r
+                                                       $.inArray("languages", s.plugins) !== -1 || \r
+                                                       t.children("ins").get(0).style.backgroundImage.length || \r
+                                                       (t.children("ins").get(0).className && t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').length)\r
+                                               ) { \r
+                                                       lang = false;\r
+                                                       if($.inArray("languages", s.plugins) !== -1 && $.isArray(s.languages) && s.languages.length) {\r
+                                                               $.each(s.languages, function (l, lv) {\r
+                                                                       if(t.hasClass(lv)) {\r
+                                                                               lang = lv;\r
+                                                                               return false;\r
+                                                                       }\r
+                                                               });\r
+                                                       }\r
+                                                       tmp2 = { attr : { }, title : _this.get_text(t, lang) }; \r
+                                                       $.each(a_attr, function (k, z) {\r
+                                                               tmp1.attr[z] = (t.attr(z) || "").replace(/jstree[^ ]*|$/ig,'');\r
+                                                       });\r
+                                                       $.each(s.languages, function (k, z) {\r
+                                                               if(t.hasClass(z)) { tmp2.language = z; return true; }\r
+                                                       });\r
+                                                       if(t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) {\r
+                                                               tmp2.icon = t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"");\r
+                                                       }\r
+                                                       if(t.children("ins").get(0).style.backgroundImage.length) {\r
+                                                               tmp2.icon = t.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","");\r
+                                                       }\r
+                                               }\r
+                                               else {\r
+                                                       tmp2 = _this.get_text(t);\r
+                                               }\r
+                                               if(a.length > 1) { tmp1.data.push(tmp2); }\r
+                                               else { tmp1.data = tmp2; }\r
+                                       });\r
+                                       li = li.find("> ul > li");\r
+                                       if(li.length) { tmp1.children = _this.get_json(li, li_attr, a_attr, true); }\r
+                                       result.push(tmp1);\r
+                               });\r
+                               return result;\r
+                       }\r
+               }\r
+       });\r
+})(jQuery);\r
+//*/\r
+\r
+/* \r
+ * jsTree languages plugin 1.0\r
+ * Adds support for multiple language versions in one tree\r
+ * This basically allows for many titles coexisting in one node, but only one of them being visible at any given time\r
+ * This is useful for maintaining the same structure in many languages (hence the name of the plugin)\r
+ */\r
+(function ($) {\r
+       $.jstree.plugin("languages", {\r
+               __init : function () { this._load_css();  },\r
+               defaults : [],\r
+               _fn : {\r
+                       set_lang : function (i) { \r
+                               var langs = this._get_settings().languages,\r
+                                       st = false,\r
+                                       selector = ".jstree-" + this.get_index() + ' a';\r
+                               if(!$.isArray(langs) || langs.length === 0) { return false; }\r
+                               if($.inArray(i,langs) == -1) {\r
+                                       if(!!langs[i]) { i = langs[i]; }\r
+                                       else { return false; }\r
+                               }\r
+                               if(i == this.data.languages.current_language) { return true; }\r
+                               st = $.vakata.css.get_css(selector + "." + this.data.languages.current_language, false, this.data.languages.language_css);\r
+                               if(st !== false) { st.style.display = "none"; }\r
+                               st = $.vakata.css.get_css(selector + "." + i, false, this.data.languages.language_css);\r
+                               if(st !== false) { st.style.display = ""; }\r
+                               this.data.languages.current_language = i;\r
+                               this.__callback(i);\r
+                               return true;\r
+                       },\r
+                       get_lang : function () {\r
+                               return this.data.languages.current_language;\r
+                       },\r
+                       get_text : function (obj, lang) {\r
+                               obj = this._get_node(obj) || this.data.ui.last_selected;\r
+                               if(!obj.size()) { return false; }\r
+                               var langs = this._get_settings().languages,\r
+                                       s = this._get_settings().core.html_titles;\r
+                               if($.isArray(langs) && langs.length) {\r
+                                       lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;\r
+                                       obj = obj.children("a." + lang);\r
+                               }\r
+                               else { obj = obj.children("a:eq(0)"); }\r
+                               if(s) {\r
+                                       obj = obj.clone();\r
+                                       obj.children("INS").remove();\r
+                                       return obj.html();\r
+                               }\r
+                               else {\r
+                                       obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];\r
+                                       return obj.nodeValue;\r
+                               }\r
+                       },\r
+                       set_text : function (obj, val, lang) {\r
+                               obj = this._get_node(obj) || this.data.ui.last_selected;\r
+                               if(!obj.size()) { return false; }\r
+                               var langs = this._get_settings().languages,\r
+                                       s = this._get_settings().core.html_titles,\r
+                                       tmp;\r
+                               if($.isArray(langs) && langs.length) {\r
+                                       lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;\r
+                                       obj = obj.children("a." + lang);\r
+                               }\r
+                               else { obj = obj.children("a:eq(0)"); }\r
+                               if(s) {\r
+                                       tmp = obj.children("INS").clone();\r
+                                       obj.html(val).prepend(tmp);\r
+                                       this.__callback({ "obj" : obj, "name" : val, "lang" : lang });\r
+                                       return true;\r
+                               }\r
+                               else {\r
+                                       obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];\r
+                                       this.__callback({ "obj" : obj, "name" : val, "lang" : lang });\r
+                                       return (obj.nodeValue = val);\r
+                               }\r
+                       },\r
+                       _load_css : function () {\r
+                               var langs = this._get_settings().languages,\r
+                                       str = "/* languages css */",\r
+                                       selector = ".jstree-" + this.get_index() + ' a',\r
+                                       ln;\r
+                               if($.isArray(langs) && langs.length) {\r
+                                       this.data.languages.current_language = langs[0];\r
+                                       for(ln = 0; ln < langs.length; ln++) {\r
+                                               str += selector + "." + langs[ln] + " {";\r
+                                               if(langs[ln] != this.data.languages.current_language) { str += " display:none; "; }\r
+                                               str += " } ";\r
+                                       }\r
+                                       this.data.languages.language_css = $.vakata.css.add_sheet({ 'str' : str });\r
+                               }\r
+                       },\r
+                       create_node : function (obj, position, js, callback) {\r
+                               var t = this.__call_old(true, obj, position, js, function (t) {\r
+                                       var langs = this._get_settings().languages,\r
+                                               a = t.children("a"),\r
+                                               ln;\r
+                                       if($.isArray(langs) && langs.length) {\r
+                                               for(ln = 0; ln < langs.length; ln++) {\r
+                                                       if(!a.is("." + langs[ln])) {\r
+                                                               t.append(a.eq(0).clone().removeClass(langs.join(" ")).addClass(langs[ln]));\r
+                                                       }\r
+                                               }\r
+                                               a.not("." + langs.join(", .")).remove();\r
+                                       }\r
+                                       if(callback) { callback.call(this, t); }\r
+                               });\r
+                               return t;\r
+                       }\r
+               }\r
+       });\r
+})(jQuery);\r
+//*/\r
+\r
+/*\r
+ * jsTree cookies plugin 1.0\r
+ * Stores the currently opened/selected nodes in a cookie and then restores them\r
+ * Depends on the jquery.cookie plugin\r
+ */\r
+(function ($) {\r
+       $.jstree.plugin("cookies", {\r
+               __init : function () {\r
+                       if(typeof $.cookie === "undefined") { throw "jsTree cookie: jQuery cookie plugin not included."; }\r
+\r
+                       var s = this._get_settings().cookies,\r
+                               tmp;\r
+                       if(!!s.save_opened) {\r
+                               tmp = $.cookie(s.save_opened);\r
+                               if(tmp && tmp.length) { this.data.core.to_open = tmp.split(","); }\r
+                       }\r
+                       if(!!s.save_selected) {\r
+                               tmp = $.cookie(s.save_selected);\r
+                               if(tmp && tmp.length && this.data.ui) { this.data.ui.to_select = tmp.split(","); }\r
+                       }\r
+                       this.get_container()\r
+                               .one( ( this.data.ui ? "reselect" : "reopen" ) + ".jstree", $.proxy(function () {\r
+                                       this.get_container()\r
+                                               .bind("open_node.jstree close_node.jstree select_node.jstree deselect_node.jstree", $.proxy(function (e) { \r
+                                                               if(this._get_settings().cookies.auto_save) { this.save_cookie((e.handleObj.namespace + e.handleObj.type).replace("jstree","")); }\r
+                                                       }, this));\r
+                               }, this));\r
+               },\r
+               defaults : {\r
+                       save_opened             : "jstree_open",\r
+                       save_selected   : "jstree_select",\r
+                       auto_save               : true,\r
+                       cookie_options  : {}\r
+               },\r
+               _fn : {\r
+                       save_cookie : function (c) {\r
+                               if(this.data.core.refreshing) { return; }\r
+                               var s = this._get_settings().cookies;\r
+                               if(!c) { // if called manually and not by event\r
+                                       if(s.save_opened) {\r
+                                               this.save_opened();\r
+                                               $.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options);\r
+                                       }\r
+                                       if(s.save_selected && this.data.ui) {\r
+                                               this.save_selected();\r
+                                               $.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options);\r
+                                       }\r
+                                       return;\r
+                               }\r
+                               switch(c) {\r
+                                       case "open_node":\r
+                                       case "close_node":\r
+                                               if(!!s.save_opened) { \r
+                                                       this.save_opened(); \r
+                                                       $.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options); \r
+                                               }\r
+                                               break;\r
+                                       case "select_node":\r
+                                       case "deselect_node":\r
+                                               if(!!s.save_selected && this.data.ui) { \r
+                                                       this.save_selected(); \r
+                                                       $.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options); \r
+                                               }\r
+                                               break;\r
+                               }\r
+                       }\r
+               }\r
+       });\r
+       // include cookies by default\r
+       $.jstree.defaults.plugins.push("cookies");\r
+})(jQuery);\r
+//*/\r
+\r
+/*\r
+ * jsTree sort plugin 1.0\r
+ * Sorts items alphabetically (or using any other function)\r
+ */\r
+(function ($) {\r
+       $.jstree.plugin("sort", {\r
+               __init : function () {\r
+                       this.get_container()\r
+                               .bind("load_node.jstree", $.proxy(function (e, data) {\r
+                                               var obj = this._get_node(data.rslt.obj);\r
+                                               obj = obj === -1 ? this.get_container().children("ul") : obj.children("ul");\r
+                                               this.sort(obj);\r
+                                       }, this))\r
+                               .bind("rename_node.jstree", $.proxy(function (e, data) {\r
+                                               this.sort(data.rslt.obj.parent());\r
+                                       }, this))\r
+                               .bind("move_node.jstree", $.proxy(function (e, data) {\r
+                                               var m = data.rslt.np == -1 ? this.get_container() : data.rslt.np;\r
+                                               this.sort(m.children("ul"));\r
+                                       }, this));\r
+               },\r
+               defaults : function (a, b) { return this.get_text(a) > this.get_text(b) ? 1 : -1; },\r
+               _fn : {\r
+                       sort : function (obj) {\r
+                               var s = this._get_settings().sort,\r
+                                       t = this;\r
+                               obj.append($.makeArray(obj.children("li")).sort($.proxy(s, t)));\r
+                               obj.find("> li > ul").each(function() { t.sort($(this)); });\r
+                               this.clean_node(obj);\r
+                       }\r
+               }\r
+       });\r
+})(jQuery);\r
+//*/\r
+\r
+/*\r
+ * jsTree DND plugin 1.0\r
+ * Drag and drop plugin for moving/copying nodes\r
+ */\r
+(function ($) {\r
+       var o = false,\r
+               r = false,\r
+               m = false,\r
+               sli = false,\r
+               sti = false,\r
+               dir1 = false,\r
+               dir2 = false;\r
+       $.vakata.dnd = {\r
+               is_down : false,\r
+               is_drag : false,\r
+               helper : false,\r
+               scroll_spd : 10,\r
+               init_x : 0,\r
+               init_y : 0,\r
+               threshold : 5,\r
+               user_data : {},\r
+\r
+               drag_start : function (e, data, html) { \r
+                       if($.vakata.dnd.is_drag) { $.vakata.drag_stop({}); }\r
+                       try {\r
+                               e.currentTarget.unselectable = "on";\r
+                               e.currentTarget.onselectstart = function() { return false; };\r
+                               if(e.currentTarget.style) { e.currentTarget.style.MozUserSelect = "none"; }\r
+                       } catch(err) { }\r
+                       $.vakata.dnd.init_x = e.pageX;\r
+                       $.vakata.dnd.init_y = e.pageY;\r
+                       $.vakata.dnd.user_data = data;\r
+                       $.vakata.dnd.is_down = true;\r
+                       $.vakata.dnd.helper = $("<div id='vakata-dragged'>").html(html).css("opacity", "0.75");\r
+                       $(document).bind("mousemove", $.vakata.dnd.drag);\r
+                       $(document).bind("mouseup", $.vakata.dnd.drag_stop);\r
+                       return false;\r
+               },\r
+               drag : function (e) { \r
+                       if(!$.vakata.dnd.is_down) { return; }\r
+                       if(!$.vakata.dnd.is_drag) {\r
+                               if(Math.abs(e.pageX - $.vakata.dnd.init_x) > 5 || Math.abs(e.pageY - $.vakata.dnd.init_y) > 5) { \r
+                                       $.vakata.dnd.helper.appendTo("body");\r
+                                       $.vakata.dnd.is_drag = true;\r
+                                       $(document).triggerHandler("drag_start.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });\r
+                               }\r
+                               else { return; }\r
+                       }\r
+\r
+                       // maybe use a scrolling parent element instead of document?\r
+                       if(e.type === "mousemove") { // thought of adding scroll in order to move the helper, but mouse poisition is n/a\r
+                               var d = $(document), t = d.scrollTop(), l = d.scrollLeft();\r
+                               if(e.pageY - t < 20) { \r
+                                       if(sti && dir1 === "down") { clearInterval(sti); sti = false; }\r
+                                       if(!sti) { dir1 = "up"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() - $.vakata.dnd.scroll_spd); }, 150); }\r
+                               }\r
+                               else { \r
+                                       if(sti && dir1 === "up") { clearInterval(sti); sti = false; }\r
+                               }\r
+                               if($(window).height() - (e.pageY - t) < 20) {\r
+                                       if(sti && dir1 === "up") { clearInterval(sti); sti = false; }\r
+                                       if(!sti) { dir1 = "down"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() + $.vakata.dnd.scroll_spd); }, 150); }\r
+                               }\r
+                               else { \r
+                                       if(sti && dir1 === "down") { clearInterval(sti); sti = false; }\r
+                               }\r
+\r
+                               if(e.pageX - l < 20) {\r
+                                       if(sli && dir2 === "right") { clearInterval(sli); sli = false; }\r
+                                       if(!sli) { dir2 = "left"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() - $.vakata.dnd.scroll_spd); }, 150); }\r
+                               }\r
+                               else { \r
+                                       if(sli && dir2 === "left") { clearInterval(sli); sli = false; }\r
+                               }\r
+                               if($(window).width() - (e.pageX - l) < 20) {\r
+                                       if(sli && dir2 === "left") { clearInterval(sli); sli = false; }\r
+                                       if(!sli) { dir2 = "right"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() + $.vakata.dnd.scroll_spd); }, 150); }\r
+                               }\r
+                               else { \r
+                                       if(sli && dir2 === "right") { clearInterval(sli); sli = false; }\r
+                               }\r
+                       }\r
+\r
+                       $.vakata.dnd.helper.css({ left : (e.pageX + 5) + "px", top : (e.pageY + 10) + "px" });\r
+                       $(document).triggerHandler("drag.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });\r
+               },\r
+               drag_stop : function (e) {\r
+                       $(document).unbind("mousemove", $.vakata.dnd.drag);\r
+                       $(document).unbind("mouseup", $.vakata.dnd.drag_stop);\r
+                       $(document).triggerHandler("drag_stop.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });\r
+                       $.vakata.dnd.helper.remove();\r
+                       $.vakata.dnd.init_x = 0;\r
+                       $.vakata.dnd.init_y = 0;\r
+                       $.vakata.dnd.user_data = {};\r
+                       $.vakata.dnd.is_down = false;\r
+                       $.vakata.dnd.is_drag = false;\r
+               }\r
+       };\r
+       $(function() {\r
+               var css_string = '#vakata-dragged { display:block; margin:0 0 0 0; padding:4px 4px 4px 24px; position:absolute; top:-2000px; line-height:16px; z-index:10000; } ';\r
+               $.vakata.css.add_sheet({ str : css_string });\r
+       });\r
+\r
+       $.jstree.plugin("dnd", {\r
+               __init : function () {\r
+                       this.data.dnd = {\r
+                               active : false,\r
+                               after : false,\r
+                               inside : false,\r
+                               before : false,\r
+                               off : false,\r
+                               prepared : false,\r
+                               w : 0,\r
+                               to1 : false,\r
+                               to2 : false,\r
+                               cof : false,\r
+                               cw : false,\r
+                               ch : false,\r
+                               i1 : false,\r
+                               i2 : false\r
+                       };\r
+                       this.get_container()\r
+                               .bind("mouseenter.jstree", $.proxy(function () {\r
+                                               if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && this.data.themes) {\r
+                                                       m.attr("class", "jstree-" + this.data.themes.theme); \r
+                                                       $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);\r
+                                               }\r
+                                       }, this))\r
+                               .bind("mouseleave.jstree", $.proxy(function () {\r
+                                               if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {\r
+                                                       if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }\r
+                                                       if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }\r
+                                               }\r
+                                       }, this))\r
+                               .bind("mousemove.jstree", $.proxy(function (e) {\r
+                                               if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {\r
+                                                       var cnt = this.get_container()[0];\r
+\r
+                                                       // Horizontal scroll\r
+                                                       if(e.pageX + 24 > this.data.dnd.cof.left + this.data.dnd.cw) {\r
+                                                               if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }\r
+                                                               this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft += $.vakata.dnd.scroll_spd; }, cnt), 100);\r
+                                                       }\r
+                                                       else if(e.pageX - 24 < this.data.dnd.cof.left) {\r
+                                                               if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }\r
+                                                               this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft -= $.vakata.dnd.scroll_spd; }, cnt), 100);\r
+                                                       }\r
+                                                       else {\r
+                                                               if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }\r
+                                                       }\r
+\r
+                                                       // Vertical scroll\r
+                                                       if(e.pageY + 24 > this.data.dnd.cof.top + this.data.dnd.ch) {\r
+                                                               if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }\r
+                                                               this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop += $.vakata.dnd.scroll_spd; }, cnt), 100);\r
+                                                       }\r
+                                                       else if(e.pageY - 24 < this.data.dnd.cof.top) {\r
+                                                               if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }\r
+                                                               this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop -= $.vakata.dnd.scroll_spd; }, cnt), 100);\r
+                                                       }\r
+                                                       else {\r
+                                                               if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }\r
+                                                       }\r
+\r
+                                               }\r
+                                       }, this))\r
+                               .delegate("a", "mousedown.jstree", $.proxy(function (e) { \r
+                                               if(e.which === 1) {\r
+                                                       this.start_drag(e.currentTarget, e);\r
+                                                       return false;\r
+                                               }\r
+                                       }, this))\r
+                               .delegate("a", "mouseenter.jstree", $.proxy(function (e) { \r
+                                               if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {\r
+                                                       this.dnd_enter(e.currentTarget);\r
+                                               }\r
+                                       }, this))\r
+                               .delegate("a", "mousemove.jstree", $.proxy(function (e) { \r
+                                               if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {\r
+                                                       if(typeof this.data.dnd.off.top === "undefined") { this.data.dnd.off = $(e.target).offset(); }\r
+                                                       this.data.dnd.w = (e.pageY - (this.data.dnd.off.top || 0)) % this.data.core.li_height;\r
+                                                       if(this.data.dnd.w < 0) { this.data.dnd.w += this.data.core.li_height; }\r
+                                                       this.dnd_show();\r
+                                               }\r
+                                       }, this))\r
+                               .delegate("a", "mouseleave.jstree", $.proxy(function (e) { \r
+                                               if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {\r
+                                                       this.data.dnd.after             = false;\r
+                                                       this.data.dnd.before    = false;\r
+                                                       this.data.dnd.inside    = false;\r
+                                                       $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");\r
+                                                       m.hide();\r
+                                                       if(r && r[0] === e.target.parentNode) {\r
+                                                               if(this.data.dnd.to1) {\r
+                                                                       clearTimeout(this.data.dnd.to1);\r
+                                                                       this.data.dnd.to1 = false;\r
+                                                               }\r
+                                                               if(this.data.dnd.to2) {\r
+                                                                       clearTimeout(this.data.dnd.to2);\r
+                                                                       this.data.dnd.to2 = false;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }, this))\r
+                               .delegate("a", "mouseup.jstree", $.proxy(function (e) { \r
+                                               if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {\r
+                                                       this.dnd_finish(e);\r
+                                               }\r
+                                       }, this));\r
+\r
+                       $(document)\r
+                               .bind("drag_stop.vakata", $.proxy(function () {\r
+                                               this.data.dnd.after             = false;\r
+                                               this.data.dnd.before    = false;\r
+                                               this.data.dnd.inside    = false;\r
+                                               this.data.dnd.off               = false;\r
+                                               this.data.dnd.prepared  = false;\r
+                                               this.data.dnd.w                 = false;\r
+                                               this.data.dnd.to1               = false;\r
+                                               this.data.dnd.to2               = false;\r
+                                               this.data.dnd.active    = false;\r
+                                               this.data.dnd.foreign   = false;\r
+                                               if(m) { m.css({ "top" : "-2000px" }); }\r
+                                       }, this))\r
+                               .bind("drag_start.vakata", $.proxy(function (e, data) {\r
+                                               if(data.data.jstree) { \r
+                                                       var et = $(data.event.target);\r
+                                                       if(et.closest(".jstree").hasClass("jstree-" + this.get_index())) {\r
+                                                               this.dnd_enter(et);\r
+                                                       }\r
+                                               }\r
+                                       }, this));\r
+\r
+                       var s = this._get_settings().dnd;\r
+                       if(s.drag_target) {\r
+                               $(document)\r
+                                       .delegate(s.drag_target, "mousedown.jstree", $.proxy(function (e) {\r
+                                               o = e.target;\r
+                                               $.vakata.dnd.drag_start(e, { jstree : true, obj : e.target }, "<ins class='jstree-icon'></ins>" + $(e.target).text() );\r
+                                               if(this.data.themes) { \r
+                                                       m.attr("class", "jstree-" + this.data.themes.theme); \r
+                                                       $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme); \r
+                                               }\r
+                                               $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");\r
+                                               var cnt = this.get_container();\r
+                                               this.data.dnd.cof = cnt.offset();\r
+                                               this.data.dnd.cw = parseInt(cnt.width(),10);\r
+                                               this.data.dnd.ch = parseInt(cnt.height(),10);\r
+                                               this.data.dnd.foreign = true;\r
+                                               return false;\r
+                                       }, this));\r
+                       }\r
+                       if(s.drop_target) {\r
+                               $(document)\r
+                                       .delegate(s.drop_target, "mouseenter.jstree", $.proxy(function (e) {\r
+                                                       if(this.data.dnd.active && this._get_settings().dnd.drop_check.call(this, { "o" : o, "r" : $(e.target) })) {\r
+                                                               $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");\r
+                                                       }\r
+                                               }, this))\r
+                                       .delegate(s.drop_target, "mouseleave.jstree", $.proxy(function (e) {\r
+                                                       if(this.data.dnd.active) {\r
+                                                               $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");\r
+                                                       }\r
+                                               }, this))\r
+                                       .delegate(s.drop_target, "mouseup.jstree", $.proxy(function (e) {\r
+                                                       if(this.data.dnd.active && $.vakata.dnd.helper.children("ins").hasClass("jstree-ok")) {\r
+                                                               this._get_settings().dnd.drop_finish.call(this, { "o" : o, "r" : $(e.target) });\r
+                                                       }\r
+                                               }, this));\r
+                       }\r
+               },\r
+               defaults : {\r
+                       copy_modifier   : "ctrl",\r
+                       check_timeout   : 200,\r
+                       open_timeout    : 500,\r
+                       drop_target             : ".jstree-drop",\r
+                       drop_check              : function (data) { return true; },\r
+                       drop_finish             : $.noop,\r
+                       drag_target             : ".jstree-draggable",\r
+                       drag_finish             : $.noop,\r
+                       drag_check              : function (data) { return { after : false, before : false, inside : true }; }\r
+               },\r
+               _fn : {\r
+                       dnd_prepare : function () {\r
+                               if(!r || !r.length) { return; }\r
+                               this.data.dnd.off = r.offset();\r
+                               if(this._get_settings().core.rtl) {\r
+                                       this.data.dnd.off.right = this.data.dnd.off.left + r.width();\r
+                               }\r
+                               if(this.data.dnd.foreign) {\r
+                                       var a = this._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : r });\r
+                                       this.data.dnd.after = a.after;\r
+                                       this.data.dnd.before = a.before;\r
+                                       this.data.dnd.inside = a.inside;\r
+                                       this.data.dnd.prepared = true;\r
+                                       return this.dnd_show();\r
+                               }\r
+                               this.prepare_move(o, r, "before");\r
+                               this.data.dnd.before = this.check_move();\r
+                               this.prepare_move(o, r, "after");\r
+                               this.data.dnd.after = this.check_move();\r
+                               if(this._is_loaded(r)) {\r
+                                       this.prepare_move(o, r, "inside");\r
+                                       this.data.dnd.inside = this.check_move();\r
+                               }\r
+                               else {\r
+                                       this.data.dnd.inside = false;\r
+                               }\r
+                               this.data.dnd.prepared = true;\r
+                               return this.dnd_show();\r
+                       },\r
+                       dnd_show : function () {\r
+                               if(!this.data.dnd.prepared) { return; }\r
+                               var o = ["before","inside","after"],\r
+                                       r = false,\r
+                                       rtl = this._get_settings().core.rtl,\r
+                                       pos;\r
+                               if(this.data.dnd.w < this.data.core.li_height/3) { o = ["before","inside","after"]; }\r
+                               else if(this.data.dnd.w <= this.data.core.li_height*2/3) {\r
+                                       o = this.data.dnd.w < this.data.core.li_height/2 ? ["inside","before","after"] : ["inside","after","before"];\r
+                               }\r
+                               else { o = ["after","inside","before"]; }\r
+                               $.each(o, $.proxy(function (i, val) { \r
+                                       if(this.data.dnd[val]) {\r
+                                               $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");\r
+                                               r = val;\r
+                                               return false;\r
+                                       }\r
+                               }, this));\r
+                               if(r === false) { $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid"); }\r
+                               \r
+                               pos = rtl ? (this.data.dnd.off.right - 18) : (this.data.dnd.off.left + 10);\r
+                               switch(r) {\r
+                                       case "before":\r
+                                               m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top - 6) + "px" }).show();\r
+                                               break;\r
+                                       case "after":\r
+                                               m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height - 7) + "px" }).show();\r
+                                               break;\r
+                                       case "inside":\r
+                                               m.css({ "left" : pos + ( rtl ? -4 : 4) + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height/2 - 5) + "px" }).show();\r
+                                               break;\r
+                                       default:\r
+                                               m.hide();\r
+                                               break;\r
+                               }\r
+                               return r;\r
+                       },\r
+                       dnd_open : function () {\r
+                               this.data.dnd.to2 = false;\r
+                               this.open_node(r, $.proxy(this.dnd_prepare,this), true);\r
+                       },\r
+                       dnd_finish : function (e) {\r
+                               if(this.data.dnd.foreign) {\r
+                                       if(this.data.dnd.after || this.data.dnd.before || this.data.dnd.inside) {\r
+                                               this._get_settings().dnd.drag_finish.call(this, { "o" : o, "r" : r });\r
+                                       }\r
+                               }\r
+                               else {\r
+                                       this.dnd_prepare();\r
+                                       this.move_node(o, r, this.dnd_show(), e[this._get_settings().dnd.copy_modifier + "Key"]);\r
+                               }\r
+                               o = false;\r
+                               r = false;\r
+                               m.hide();\r
+                       },\r
+                       dnd_enter : function (obj) {\r
+                               var s = this._get_settings().dnd;\r
+                               this.data.dnd.prepared = false;\r
+                               r = this._get_node(obj);\r
+                               if(s.check_timeout) { \r
+                                       // do the calculations after a minimal timeout (users tend to drag quickly to the desired location)\r
+                                       if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }\r
+                                       this.data.dnd.to1 = setTimeout($.proxy(this.dnd_prepare, this), s.check_timeout); \r
+                               }\r
+                               else { \r
+                                       this.dnd_prepare(); \r
+                               }\r
+                               if(s.open_timeout) { \r
+                                       if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }\r
+                                       if(r && r.length && r.hasClass("jstree-closed")) { \r
+                                               // if the node is closed - open it, then recalculate\r
+                                               this.data.dnd.to2 = setTimeout($.proxy(this.dnd_open, this), s.open_timeout);\r
+                                       }\r
+                               }\r
+                               else {\r
+                                       if(r && r.length && r.hasClass("jstree-closed")) { \r
+                                               this.dnd_open();\r
+                                       }\r
+                               }\r
+                       },\r
+                       start_drag : function (obj, e) {\r
+                               o = this._get_node(obj);\r
+                               if(this.data.ui && this.is_selected(o)) { o = this._get_node(null, true); }\r
+                               $.vakata.dnd.drag_start(e, { jstree : true, obj : o }, "<ins class='jstree-icon'></ins>" + (o.length > 1 ? "Multiple selection" : this.get_text(o)) );\r
+                               if(this.data.themes) { \r
+                                       m.attr("class", "jstree-" + this.data.themes.theme); \r
+                                       $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme); \r
+                               }\r
+                               var cnt = this.get_container();\r
+                               this.data.dnd.cof = cnt.children("ul").offset();\r
+                               this.data.dnd.cw = parseInt(cnt.width(),10);\r
+                               this.data.dnd.ch = parseInt(cnt.height(),10);\r
+                               this.data.dnd.active = true;\r
+                       }\r
+               }\r
+       });\r
+       $(function() {\r
+               var css_string = '' + \r
+                       '#vakata-dragged ins { display:block; text-decoration:none; width:16px; height:16px; margin:0 0 0 0; padding:0; position:absolute; top:4px; left:4px; } ' + \r
+                       '#vakata-dragged .jstree-ok { background:green; } ' + \r
+                       '#vakata-dragged .jstree-invalid { background:red; } ' + \r
+                       '#jstree-marker { padding:0; margin:0; line-height:12px; font-size:1px; overflow:hidden; height:12px; width:8px; position:absolute; top:-30px; z-index:10000; background-repeat:no-repeat; display:none; background-color:silver; } ';\r
+               $.vakata.css.add_sheet({ str : css_string });\r
+               m = $("<div>").attr({ id : "jstree-marker" }).hide().appendTo("body");\r
+               $(document).bind("drag_start.vakata", function (e, data) {\r
+                       if(data.data.jstree) { \r
+                               m.show(); \r
+                       }\r
+               });\r
+               $(document).bind("drag_stop.vakata", function (e, data) {\r
+                       if(data.data.jstree) { m.hide(); }\r
+               });\r
+       });\r
+})(jQuery);\r
+//*/\r
+\r
+/*\r
+ * jsTree checkbox plugin 1.0\r
+ * Inserts checkboxes in front of every node\r
+ * Depends on the ui plugin\r
+ * DOES NOT WORK NICELY WITH MULTITREE DRAG'N'DROP\r
+ */\r
+(function ($) {\r
+       $.jstree.plugin("checkbox", {\r
+               __init : function () {\r
+                       this.select_node = this.deselect_node = this.deselect_all = $.noop;\r
+                       this.get_selected = this.get_checked;\r
+\r
+                       this.get_container()\r
+                               .bind("open_node.jstree create_node.jstree clean_node.jstree", $.proxy(function (e, data) { \r
+                                               this._prepare_checkboxes(data.rslt.obj);\r
+                                       }, this))\r
+                               .bind("loaded.jstree", $.proxy(function (e) {\r
+                                               this._prepare_checkboxes();\r
+                                       }, this))\r
+                               .delegate("a", "click.jstree", $.proxy(function (e) {\r
+                                               if(this._get_node(e.target).hasClass("jstree-checked")) { this.uncheck_node(e.target); }\r
+                                               else { this.check_node(e.target); }\r
+                                               if(this.data.ui) { this.save_selected(); }\r
+                                               if(this.data.cookies) { this.save_cookie("select_node"); }\r
+                                               e.preventDefault();\r
+                                       }, this));\r
+               },\r
+               __destroy : function () {\r
+                       this.get_container().find(".jstree-checkbox").remove();\r
+               },\r
+               _fn : {\r
+                       _prepare_checkboxes : function (obj) {\r
+                               obj = !obj || obj == -1 ? this.get_container() : this._get_node(obj);\r
+                               var c, _this = this, t;\r
+                               obj.each(function () {\r
+                                       t = $(this);\r
+                                       c = t.is("li") && t.hasClass("jstree-checked") ? "jstree-checked" : "jstree-unchecked";\r
+                                       t.find("a").not(":has(.jstree-checkbox)").prepend("<ins class='jstree-checkbox'>&#160;</ins>").parent().not(".jstree-checked, .jstree-unchecked").addClass(c);\r
+                               });\r
+                               if(obj.is("li")) { this._repair_state(obj); }\r
+                               else { obj.find("> ul > li").each(function () { _this._repair_state(this); }); }\r
+                       },\r
+                       change_state : function (obj, state) {\r
+                               obj = this._get_node(obj);\r
+                               state = (state === false || state === true) ? state : obj.hasClass("jstree-checked");\r
+                               if(state) { obj.find("li").andSelf().removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked"); }\r
+                               else { \r
+                                       obj.find("li").andSelf().removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked"); \r
+                                       if(this.data.ui) { this.data.ui.last_selected = obj; }\r
+                                       this.data.checkbox.last_selected = obj;\r
+                               }\r
+                               obj.parentsUntil(".jstree", "li").each(function () {\r
+                                       var $this = $(this);\r
+                                       if(state) {\r
+                                               if($this.children("ul").children(".jstree-checked, .jstree-undetermined").length) {\r
+                                                       $this.parentsUntil(".jstree", "li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");\r
+                                                       return false;\r
+                                               }\r
+                                               else {\r
+                                                       $this.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked");\r
+                                               }\r
+                                       }\r
+                                       else {\r
+                                               if($this.children("ul").children(".jstree-unchecked, .jstree-undetermined").length) {\r
+                                                       $this.parentsUntil(".jstree", "li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");\r
+                                                       return false;\r
+                                               }\r
+                                               else {\r
+                                                       $this.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked");\r
+                                               }\r
+                                       }\r
+                               });\r
+                               if(this.data.ui) { this.data.ui.selected = this.get_checked(); }\r
+                               this.__callback(obj);\r
+                       },\r
+                       check_node : function (obj) {\r
+                               this.change_state(obj, false);\r
+                       },\r
+                       uncheck_node : function (obj) {\r
+                               this.change_state(obj, true);\r
+                       },\r
+                       check_all : function () {\r
+                               var _this = this;\r
+                               this.get_container().children("ul").children("li").each(function () {\r
+                                       _this.check_node(this, false);\r
+                               });\r
+                       },\r
+                       uncheck_all : function () {\r
+                               var _this = this;\r
+                               this.get_container().children("ul").children("li").each(function () {\r
+                                       _this.change_state(this, true);\r
+                               });\r
+                       },\r
+\r
+                       is_checked : function(obj) {\r
+                               obj = this._get_node(obj);\r
+                               return obj.length ? obj.is(".jstree-checked") : false;\r
+                       },\r
+                       get_checked : function (obj) {\r
+                               obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);\r
+                               return obj.find("> ul > .jstree-checked, .jstree-undetermined > ul > .jstree-checked");\r
+                       },\r
+                       get_unchecked : function (obj) { \r
+                               obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);\r
+                               return obj.find("> ul > .jstree-unchecked, .jstree-undetermined > ul > .jstree-unchecked");\r
+                       },\r
+\r
+                       show_checkboxes : function () { this.get_container().children("ul").removeClass("jstree-no-checkboxes"); },\r
+                       hide_checkboxes : function () { this.get_container().children("ul").addClass("jstree-no-checkboxes"); },\r
+\r
+                       _repair_state : function (obj) {\r
+                               obj = this._get_node(obj);\r
+                               if(!obj.length) { return; }\r
+                               var a = obj.find("> ul > .jstree-checked").length,\r
+                                       b = obj.find("> ul > .jstree-undetermined").length,\r
+                                       c = obj.find("> ul > li").length;\r
+\r
+                               if(c === 0) { if(obj.hasClass("jstree-undetermined")) { this.check_node(obj); } }\r
+                               else if(a === 0 && b === 0) { this.uncheck_node(obj); }\r
+                               else if(a === c) { this.check_node(obj); }\r
+                               else { \r
+                                       obj.parentsUntil(".jstree","li").removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");\r
+                               }\r
+                       },\r
+                       reselect : function () {\r
+                               if(this.data.ui) { \r
+                                       var _this = this,\r
+                                               s = this.data.ui.to_select;\r
+                                       s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace('\\/','/').replace('/','\\/'); });\r
+                                       this.deselect_all();\r
+                                       $.each(s, function (i, val) { _this.check_node(val); });\r
+                                       this.__callback();\r
+                               }\r
+                       }\r
+               }\r
+       });\r
+})(jQuery);\r
+//*/\r
+\r
+/* \r
+ * jsTree XML 1.0\r
+ * The XML data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions.\r
+ */\r
+(function ($) {\r
+       $.vakata.xslt = function (xml, xsl, callback) {\r
+               var rs = "", xm, xs, processor, support;\r
+               if(document.recalc) {\r
+                       xm = document.createElement('xml');\r
+                       xs = document.createElement('xml');\r
+                       xm.innerHTML = xml;\r
+                       xs.innerHTML = xsl;\r
+                       $("body").append(xm).append(xs);\r
+                       setTimeout( (function (xm, xs, callback) {\r
+                               return function () {\r
+                                       callback.call(null, xm.transformNode(xs.XMLDocument));\r
+                                       setTimeout( (function (xm, xs) { return function () { jQuery("body").remove(xm).remove(xs); }; })(xm, xs), 200);\r
+                               };\r
+                       }) (xm, xs, callback), 100);\r
+                       return true;\r
+               }\r
+               if(typeof window.DOMParser !== "undefined" && typeof window.XMLHttpRequest !== "undefined" && typeof window.XSLTProcessor !== "undefined") {\r
+                       processor = new XSLTProcessor();\r
+                       support = $.isFunction(processor.transformDocument) ? (typeof window.XMLSerializer !== "undefined") : true;\r
+                       if(!support) { return false; }\r
+                       xml = new DOMParser().parseFromString(xml, "text/xml");\r
+                       xsl = new DOMParser().parseFromString(xsl, "text/xml");\r
+                       if($.isFunction(processor.transformDocument)) {\r
+                               rs = document.implementation.createDocument("", "", null);\r
+                               processor.transformDocument(xml, xsl, rs, null);\r
+                               callback.call(null, XMLSerializer().serializeToString(rs));\r
+                               return true;\r
+                       }\r
+                       else {\r
+                               processor.importStylesheet(xsl);\r
+                               rs = processor.transformToFragment(xml, document);\r
+                               callback.call(null, $("<div>").append(rs).html());\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       };\r
+       var xsl = {\r
+               'nest' : '<?xml version="1.0" encoding="utf-8" ?>' + \r
+                       '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' + \r
+                       '<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/html" />' + \r
+                       '<xsl:template match="/">' + \r
+                       '       <xsl:call-template name="nodes">' + \r
+                       '               <xsl:with-param name="node" select="/root" />' + \r
+                       '       </xsl:call-template>' + \r
+                       '</xsl:template>' + \r
+                       '<xsl:template name="nodes">' + \r
+                       '       <xsl:param name="node" />' + \r
+                       '       <ul>' + \r
+                       '       <xsl:for-each select="$node/item">' + \r
+                       '               <xsl:variable name="children" select="count(./item) &gt; 0" />' + \r
+                       '               <li>' + \r
+                       '                       <xsl:attribute name="class">' + \r
+                       '                               <xsl:if test="position() = last()">jstree-last </xsl:if>' + \r
+                       '                               <xsl:choose>' + \r
+                       '                                       <xsl:when test="@state = \'open\'">jstree-open </xsl:when>' + \r
+                       '                                       <xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' + \r
+                       '                                       <xsl:otherwise>jstree-leaf </xsl:otherwise>' + \r
+                       '                               </xsl:choose>' + \r
+                       '                               <xsl:value-of select="@class" />' + \r
+                       '                       </xsl:attribute>' + \r
+                       '                       <xsl:for-each select="@*">' + \r
+                       '                               <xsl:if test="name() != \'class\' and name() != \'state\' and name() != \'hasChildren\'">' + \r
+                       '                                       <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' + \r
+                       '                               </xsl:if>' + \r
+                       '                       </xsl:for-each>' + \r
+                       '       <ins class="jstree-icon"><xsl:text>&#xa0;</xsl:text></ins>' + \r
+                       '                       <xsl:for-each select="content/name">' + \r
+                       '                               <a>' + \r
+                       '                               <xsl:attribute name="href">' + \r
+                       '                                       <xsl:choose>' + \r
+                       '                                       <xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' + \r
+                       '                                       <xsl:otherwise>#</xsl:otherwise>' + \r
+                       '                                       </xsl:choose>' + \r
+                       '                               </xsl:attribute>' + \r
+                       '                               <xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' + \r
+                       '                               <xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' + \r
+                       '                               <xsl:for-each select="@*">' + \r
+                       '                                       <xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' + \r
+                       '                                               <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' + \r
+                       '                                       </xsl:if>' + \r
+                       '                               </xsl:for-each>' + \r
+                       '                                       <ins>' + \r
+                       '                                               <xsl:attribute name="class">jstree-icon ' + \r
+                       '                                                       <xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' + \r
+                       '                                               </xsl:attribute>' + \r
+                       '                                               <xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' + \r
+                       '                                               <xsl:text>&#xa0;</xsl:text>' + \r
+                       '                                       </ins>' + \r
+                       '                                       <xsl:value-of select="current()" />' + \r
+                       '                               </a>' + \r
+                       '                       </xsl:for-each>' + \r
+                       '                       <xsl:if test="$children or @hasChildren"><xsl:call-template name="nodes"><xsl:with-param name="node" select="current()" /></xsl:call-template></xsl:if>' + \r
+                       '               </li>' + \r
+                       '       </xsl:for-each>' + \r
+                       '       </ul>' + \r
+                       '</xsl:template>' + \r
+                       '</xsl:stylesheet>',\r
+\r
+               'flat' : '<?xml version="1.0" encoding="utf-8" ?>' + \r
+                       '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' + \r
+                       '<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/xml" />' + \r
+                       '<xsl:template match="/">' + \r
+                       '       <ul>' + \r
+                       '       <xsl:for-each select="//item[not(@parent_id) or @parent_id=0 or not(@parent_id = //item/@id)]">' + /* the last `or` may be removed */\r
+                       '               <xsl:call-template name="nodes">' + \r
+                       '                       <xsl:with-param name="node" select="." />' + \r
+                       '                       <xsl:with-param name="is_last" select="number(position() = last())" />' + \r
+                       '               </xsl:call-template>' + \r
+                       '       </xsl:for-each>' + \r
+                       '       </ul>' + \r
+                       '</xsl:template>' + \r
+                       '<xsl:template name="nodes">' + \r
+                       '       <xsl:param name="node" />' + \r
+                       '       <xsl:param name="is_last" />' + \r
+                       '       <xsl:variable name="children" select="count(//item[@parent_id=$node/attribute::id]) &gt; 0" />' + \r
+                       '       <li>' + \r
+                       '       <xsl:attribute name="class">' + \r
+                       '               <xsl:if test="$is_last = true()">jstree-last </xsl:if>' + \r
+                       '               <xsl:choose>' + \r
+                       '                       <xsl:when test="@state = \'open\'">jstree-open </xsl:when>' + \r
+                       '                       <xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' + \r
+                       '                       <xsl:otherwise>jstree-leaf </xsl:otherwise>' + \r
+                       '               </xsl:choose>' + \r
+                       '               <xsl:value-of select="@class" />' + \r
+                       '       </xsl:attribute>' + \r
+                       '       <xsl:for-each select="@*">' + \r
+                       '               <xsl:if test="name() != \'parent_id\' and name() != \'hasChildren\' and name() != \'class\' and name() != \'state\'">' + \r
+                       '               <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' + \r
+                       '               </xsl:if>' + \r
+                       '       </xsl:for-each>' + \r
+                       '       <ins class="jstree-icon"><xsl:text>&#xa0;</xsl:text></ins>' + \r
+                       '       <xsl:for-each select="content/name">' + \r
+                       '               <a>' + \r
+                       '               <xsl:attribute name="href">' + \r
+                       '                       <xsl:choose>' + \r
+                       '                       <xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' + \r
+                       '                       <xsl:otherwise>#</xsl:otherwise>' + \r
+                       '                       </xsl:choose>' + \r
+                       '               </xsl:attribute>' + \r
+                       '               <xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' + \r
+                       '               <xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' + \r
+                       '               <xsl:for-each select="@*">' + \r
+                       '                       <xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' + \r
+                       '                               <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' + \r
+                       '                       </xsl:if>' + \r
+                       '               </xsl:for-each>' + \r
+                       '                       <ins>' + \r
+                       '                               <xsl:attribute name="class">jstree-icon ' + \r
+                       '                                       <xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' + \r
+                       '                               </xsl:attribute>' + \r
+                       '                               <xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' + \r
+                       '                               <xsl:text>&#xa0;</xsl:text>' + \r
+                       '                       </ins>' + \r
+                       '                       <xsl:value-of select="current()" />' + \r
+                       '               </a>' + \r
+                       '       </xsl:for-each>' + \r
+                       '       <xsl:if test="$children">' + \r
+                       '               <ul>' + \r
+                       '               <xsl:for-each select="//item[@parent_id=$node/attribute::id]">' + \r
+                       '                       <xsl:call-template name="nodes">' + \r
+                       '                               <xsl:with-param name="node" select="." />' + \r
+                       '                               <xsl:with-param name="is_last" select="number(position() = last())" />' + \r
+                       '                       </xsl:call-template>' + \r
+                       '               </xsl:for-each>' + \r
+                       '               </ul>' + \r
+                       '       </xsl:if>' + \r
+                       '       </li>' + \r
+                       '</xsl:template>' + \r
+                       '</xsl:stylesheet>'\r
+       };\r
+       $.jstree.plugin("xml_data", {\r
+               defaults : { \r
+                       data : false,\r
+                       ajax : false,\r
+                       xsl : "flat",\r
+                       clean_node : false,\r
+                       correct_state : true\r
+               },\r
+               _fn : {\r
+                       load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_xml(obj, function () { _this.__callback({ "obj" : obj }); s_call.call(this); }, e_call); },\r
+                       _is_loaded : function (obj) { \r
+                               var s = this._get_settings().xml_data;\r
+                               obj = this._get_node(obj);\r
+                               return obj == -1 || !obj || !s.ajax || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;\r
+                       },\r
+                       load_node_xml : function (obj, s_call, e_call) {\r
+                               var s = this.get_settings().xml_data,\r
+                                       error_func = function () {},\r
+                                       success_func = function () {};\r
+\r
+                               obj = this._get_node(obj);\r
+                               if(obj && obj !== -1) {\r
+                                       if(obj.data("jstree-is-loading")) { return; }\r
+                                       else { obj.data("jstree-is-loading",true); }\r
+                               }\r
+                               switch(!0) {\r
+                                       case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied.";\r
+                                       case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):\r
+                                               if(!obj || obj == -1) {\r
+                                                       this.parse_xml(s.data, $.proxy(function (d) {\r
+                                                               if(d) {\r
+                                                                       d = d.replace(/ ?xmlns="[^"]*"/ig, "");\r
+                                                                       if(d.length > 10) {\r
+                                                                               d = $(d);\r
+                                                                               this.get_container().children("ul").empty().append(d.children());\r
+                                                                               if(s.clean_node) { this.clean_node(obj); }\r
+                                                                               if(s_call) { s_call.call(this); }\r
+                                                                       }\r
+                                                               }\r
+                                                               else { \r
+                                                                       if(s.correct_state) { \r
+                                                                               this.get_container().children("ul").empty(); \r
+                                                                               if(s_call) { s_call.call(this); }\r
+                                                                       }\r
+                                                               }\r
+                                                       }, this));\r
+                                               }\r
+                                               break;\r
+                                       case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):\r
+                                               error_func = function (x, t, e) {\r
+                                                       var ef = this.get_settings().xml_data.ajax.error; \r
+                                                       if(ef) { ef.call(this, x, t, e); }\r
+                                                       if(obj !== -1 && obj.length) {\r
+                                                               obj.children(".jstree-loading").removeClass("jstree-loading");\r
+                                                               obj.data("jstree-is-loading",false);\r
+                                                               if(t === "success" && s.correct_state) { obj.removeClass("jstree-open jstree-closed").addClass("jstree-leaf"); }\r
+                                                       }\r
+                                                       else {\r
+                                                               if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }\r
+                                                       }\r
+                                                       if(e_call) { e_call.call(this); }\r
+                                               };\r
+                                               success_func = function (d, t, x) {\r
+                                                       d = x.responseText;\r
+                                                       var sf = this.get_settings().xml_data.ajax.success; \r
+                                                       if(sf) { d = sf.call(this,d,t,x) || d; }\r
+                                                       if(d == "") {\r
+                                                               return error_func.call(this, x, t, "");\r
+                                                       }\r
+                                                       this.parse_xml(d, $.proxy(function (d) {\r
+                                                               if(d) {\r
+                                                                       d = d.replace(/ ?xmlns="[^"]*"/ig, "");\r
+                                                                       if(d.length > 10) {\r
+                                                                               d = $(d);\r
+                                                                               if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }\r
+                                                                               else { obj.children(".jstree-loading").removeClass("jstree-loading"); obj.append(d); obj.data("jstree-is-loading",false); }\r
+                                                                               if(s.clean_node) { this.clean_node(obj); }\r
+                                                                               if(s_call) { s_call.call(this); }\r
+                                                                       }\r
+                                                                       else {\r
+                                                                               if(obj && obj !== -1) { \r
+                                                                                       obj.children(".jstree-loading").removeClass("jstree-loading");\r
+                                                                                       obj.data("jstree-is-loading",false);\r
+                                                                                       if(s.correct_state) { \r
+                                                                                               obj.removeClass("jstree-open jstree-closed").addClass("jstree-leaf"); \r
+                                                                                               if(s_call) { s_call.call(this); } \r
+                                                                                       }\r
+                                                                               }\r
+                                                                               else {\r
+                                                                                       if(s.correct_state) { \r
+                                                                                               this.get_container().children("ul").empty();\r
+                                                                                               if(s_call) { s_call.call(this); } \r
+                                                                                       }\r
+                                                                               }\r
+                                                                       }\r
+                                                               }\r
+                                                       }, this));\r
+                                               };\r
+                                               s.ajax.context = this;\r
+                                               s.ajax.error = error_func;\r
+                                               s.ajax.success = success_func;\r
+                                               if(!s.ajax.dataType) { s.ajax.dataType = "xml"; }\r
+                                               if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }\r
+                                               if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }\r
+                                               $.ajax(s.ajax);\r
+                                               break;\r
+                               }\r
+                       },\r
+                       parse_xml : function (xml, callback) {\r
+                               var s = this._get_settings().xml_data;\r
+                               $.vakata.xslt(xml, xsl[s.xsl], callback);\r
+                       },\r
+                       get_xml : function (tp, obj, li_attr, a_attr, is_callback) {\r
+                               var result = "", \r
+                                       s = this._get_settings(), \r
+                                       _this = this,\r
+                                       tmp1, tmp2, li, a, lang;\r
+                               if(!tp) { tp = "flat"; }\r
+                               if(!is_callback) { is_callback = 0; }\r
+                               obj = this._get_node(obj);\r
+                               if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); }\r
+                               li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ];\r
+                               if(!is_callback && this.data.types && $.inArray(s.types.type_attr, li_attr) === -1) { li_attr.push(s.types.type_attr); }\r
+\r
+                               a_attr = $.isArray(a_attr) ? a_attr : [ ];\r
+\r
+                               if(!is_callback) { result += "<root>"; }\r
+                               obj.each(function () {\r
+                                       result += "<item";\r
+                                       li = $(this);\r
+                                       $.each(li_attr, function (i, v) { result += " " + v + "=\"" + (li.attr(v) || "").replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"") + "\""; });\r
+                                       if(li.hasClass("jstree-open")) { result += " state=\"open\""; }\r
+                                       if(li.hasClass("jstree-closed")) { result += " state=\"closed\""; }\r
+                                       if(tp === "flat") { result += " parent_id=\"" + is_callback + "\""; }\r
+                                       result += ">";\r
+                                       result += "<content>";\r
+                                       a = li.children("a");\r
+                                       a.each(function () {\r
+                                               tmp1 = $(this);\r
+                                               lang = false;\r
+                                               result += "<name";\r
+                                               if($.inArray("languages", s.plugins) !== -1) {\r
+                                                       $.each(s.languages, function (k, z) {\r
+                                                               if(tmp1.hasClass(z)) { result += " lang=\"" + z + "\""; lang = z; return false; }\r
+                                                       });\r
+                                               }\r
+                                               if(a_attr.length) { \r
+                                                       $.each(a_attr, function (k, z) {\r
+                                                               result += " " + z + "=\"" + (tmp1.attr(z) || "").replace(/jstree[^ ]*|$/ig,'') + "\"";\r
+                                                       });\r
+                                               }\r
+                                               if(tmp1.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) {\r
+                                                       result += ' icon="' + tmp1.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"") + '"';\r
+                                               }\r
+                                               if(tmp1.children("ins").get(0).style.backgroundImage.length) {\r
+                                                       result += ' icon="' + tmp1.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","") + '"';\r
+                                               }\r
+                                               result += ">";\r
+                                               result += "<![CDATA[" + _this.get_text(tmp1, lang) + "]]>";\r
+                                               result += "</name>";\r
+                                       });\r
+                                       result += "</content>";\r
+                                       tmp2 = li[0].id;\r
+                                       li = li.find("> ul > li");\r
+                                       if(li.length) { tmp2 = _this.get_xml(tp, li, li_attr, a_attr, tmp2); }\r
+                                       else { tmp2 = ""; }\r
+                                       if(tp == "nest") { result += tmp2; }\r
+                                       result += "</item>";\r
+                                       if(tp == "flat") { result += tmp2; }\r
+                               });\r
+                               if(!is_callback) { result += "</root>"; }\r
+                               return result;\r
+                       }\r
+               }\r
+       });\r
+})(jQuery);\r
+//*/\r
+\r
+/*\r
+ * jsTree search plugin 1.0\r
+ * Enables both sync and async search on the tree\r
+ * DOES NOT WORK WITH JSON PROGRESSIVE RENDER\r
+ */\r
+(function ($) {\r
+       $.expr[':'].jstree_contains = function(a,i,m){\r
+               return (a.textContent || a.innerText || "").toLowerCase().indexOf(m[3].toLowerCase())>=0;\r
+       };\r
+       $.jstree.plugin("search", {\r
+               __init : function () {\r
+                       this.data.search.str = "";\r
+                       this.data.search.result = $();\r
+               },\r
+               defaults : {\r
+                       ajax : false, // OR ajax object\r
+                       case_insensitive : false\r
+               },\r
+               _fn : {\r
+                       search : function (str, skip_async) {\r
+                               if(str === "") { return; }\r
+                               var s = this.get_settings().search, \r
+                                       t = this,\r
+                                       error_func = function () { },\r
+                                       success_func = function () { };\r
+                               this.data.search.str = str;\r
+\r
+                               if(!skip_async && s.ajax !== false && this.get_container().find(".jstree-closed:eq(0)").length > 0) {\r
+                                       this.search.supress_callback = true;\r
+                                       error_func = function () { };\r
+                                       success_func = function (d, t, x) {\r
+                                               var sf = this.get_settings().search.ajax.success; \r
+                                               if(sf) { d = sf.call(this,d,t,x) || d; }\r
+                                               this.data.search.to_open = d;\r
+                                               this._search_open();\r
+                                       };\r
+                                       s.ajax.context = this;\r
+                                       s.ajax.error = error_func;\r
+                                       s.ajax.success = success_func;\r
+                                       if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, str); }\r
+                                       if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, str); }\r
+                                       if(!s.ajax.data) { s.ajax.data = { "search_string" : str }; }\r
+                                       if(!s.ajax.dataType || /^json/.exec(s.ajax.dataType)) { s.ajax.dataType = "json"; }\r
+                                       $.ajax(s.ajax);\r
+                                       return;\r
+                               }\r
+                               if(this.data.search.result.length) { this.clear_search(); }\r
+                               this.data.search.result = this.get_container().find("a" + (this.data.languages ? "." + this.get_lang() : "" ) + ":" + (s.case_insensitive ? "jstree_contains" : "contains") + "(" + this.data.search.str + ")");\r
+                               this.data.search.result.addClass("jstree-search").parents(".jstree-closed").each(function () {\r
+                                       t.open_node(this, false, true);\r
+                               });\r
+                               this.__callback({ nodes : this.data.search.result, str : str });\r
+                       },\r
+                       clear_search : function (str) {\r
+                               this.data.search.result.removeClass("jstree-search");\r
+                               this.__callback(this.data.search.result);\r
+                               this.data.search.result = $();\r
+                       },\r
+                       _search_open : function (is_callback) {\r
+                               var _this = this,\r
+                                       done = true,\r
+                                       current = [],\r
+                                       remaining = [];\r
+                               if(this.data.search.to_open.length) {\r
+                                       $.each(this.data.search.to_open, function (i, val) {\r
+                                               if(val == "#") { return true; }\r
+                                               if($(val).length && $(val).is(".jstree-closed")) { current.push(val); }\r
+                                               else { remaining.push(val); }\r
+                                       });\r
+                                       if(current.length) {\r
+                                               this.data.search.to_open = remaining;\r
+                                               $.each(current, function (i, val) { \r
+                                                       _this.open_node(val, function () { _this._search_open(true); }); \r
+                                               });\r
+                                               done = false;\r
+                                       }\r
+                               }\r
+                               if(done) { this.search(this.data.search.str, true); }\r
+                       }\r
+               }\r
+       });\r
+})(jQuery);\r
+//*/\r
+\r
+/*\r
+ * jsTree contextmenu plugin 1.0\r
+ */\r
+(function ($) {\r
+       $.vakata.context = {\r
+               cnt             : $("<div id='vakata-contextmenu'>"),\r
+               vis             : false,\r
+               tgt             : false,\r
+               par             : false,\r
+               func    : false,\r
+               data    : false,\r
+               show    : function (s, t, x, y, d, p) {\r
+                       var html = $.vakata.context.parse(s), h, w;\r
+                       if(!html) { return; }\r
+                       $.vakata.context.vis = true;\r
+                       $.vakata.context.tgt = t;\r
+                       $.vakata.context.par = p || t || null;\r
+                       $.vakata.context.data = d || null;\r
+                       $.vakata.context.cnt\r
+                               .html(html)\r
+                               .css({ "visibility" : "hidden", "display" : "block", "left" : 0, "top" : 0 });\r
+                       h = $.vakata.context.cnt.height();\r
+                       w = $.vakata.context.cnt.width();\r
+                       if(x + w > $(document).width()) { \r
+                               x = $(document).width() - (w + 5); \r
+                               $.vakata.context.cnt.find("li > ul").addClass("right"); \r
+                       }\r
+                       if(y + h > $(document).height()) { \r
+                               y = y - (h + t[0].offsetHeight); \r
+                               $.vakata.context.cnt.find("li > ul").addClass("bottom"); \r
+                       }\r
+\r
+                       $.vakata.context.cnt\r
+                               .css({ "left" : x, "top" : y })\r
+                               .find("li:has(ul)")\r
+                                       .bind("mouseenter", function (e) { \r
+                                               var w = $(document).width(),\r
+                                                       h = $(document).height(),\r
+                                                       ul = $(this).children("ul").show(); \r
+                                               if(w !== $(document).width()) { ul.toggleClass("right"); }\r
+                                               if(h !== $(document).height()) { ul.toggleClass("bottom"); }\r
+                                       })\r
+                                       .bind("mouseleave", function (e) { \r
+                                               $(this).children("ul").hide(); \r
+                                       })\r
+                                       .end()\r
+                               .css({ "visibility" : "visible" })\r
+                               .show();\r
+                       $(document).triggerHandler("context_show.vakata");\r
+               },\r
+               hide    : function () {\r
+                       $.vakata.context.vis = false;\r
+                       $.vakata.context.cnt.attr("class","").hide();\r
+                       $(document).triggerHandler("context_hide.vakata");\r
+               },\r
+               parse   : function (s, is_callback) {\r
+                       if(!s) { return false; }\r
+                       var str = "",\r
+                               tmp = false,\r
+                               was_sep = true;\r
+                       if(!is_callback) { $.vakata.context.func = {}; }\r
+                       str += "<ul>";\r
+                       $.each(s, function (i, val) {\r
+                               if(!val) { return true; }\r
+                               $.vakata.context.func[i] = val.action;\r
+                               if(!was_sep && val.separator_before) {\r
+                                       str += "<li class='vakata-separator vakata-separator-before'></li>";\r
+                               }\r
+                               was_sep = false;\r
+                               str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins ";\r
+                               if(val.icon && val.icon.indexOf("/") === -1) { str += " class='" + val.icon + "' "; }\r
+                               if(val.icon && val.icon.indexOf("/") !== -1) { str += " style='background:url(" + val.icon + ") center center no-repeat;' "; }\r
+                               str += ">&#160;</ins><a href='#' rel='" + i + "'>";\r
+                               if(val.submenu) {\r
+                                       str += "<span style='float:right;'>&raquo;</span>";\r
+                               }\r
+                               str += val.label + "</a>";\r
+                               if(val.submenu) {\r
+                                       tmp = $.vakata.context.parse(val.submenu, true);\r
+                                       if(tmp) { str += tmp; }\r
+                               }\r
+                               str += "</li>";\r
+                               if(val.separator_after) {\r
+                                       str += "<li class='vakata-separator vakata-separator-after'></li>";\r
+                                       was_sep = true;\r
+                               }\r
+                       });\r
+                       str = str.replace(/<li class\='vakata-separator vakata-separator-after'\><\/li\>$/,"");\r
+                       str += "</ul>";\r
+                       return str.length > 10 ? str : false;\r
+               },\r
+               exec    : function (i) {\r
+                       if($.isFunction($.vakata.context.func[i])) {\r
+                               $.vakata.context.func[i].call($.vakata.context.data, $.vakata.context.par);\r
+                               return true;\r
+                       }\r
+                       else { return false; }\r
+               }\r
+       };\r
+       $(function () {\r
+               var css_string = '' + \r
+                       '#vakata-contextmenu { display:none; position:absolute; margin:0; padding:0; min-width:180px; background:#ebebeb; border:1px solid silver; z-index:10000; *width:180px; } ' + \r
+                       '#vakata-contextmenu ul { min-width:180px; *width:180px; } ' + \r
+                       '#vakata-contextmenu ul, #vakata-contextmenu li { margin:0; padding:0; list-style-type:none; display:block; } ' + \r
+                       '#vakata-contextmenu li { line-height:20px; min-height:20px; position:relative; padding:0px; } ' + \r
+                       '#vakata-contextmenu li a { padding:1px 6px; line-height:17px; display:block; text-decoration:none; margin:1px 1px 0 1px; } ' + \r
+                       '#vakata-contextmenu li ins { float:left; width:16px; height:16px; text-decoration:none; margin-right:2px; } ' + \r
+                       '#vakata-contextmenu li a:hover, #vakata-contextmenu li.vakata-hover > a { background:gray; color:white; } ' + \r
+                       '#vakata-contextmenu li ul { display:none; position:absolute; top:-2px; left:100%; background:#ebebeb; border:1px solid gray; } ' + \r
+                       '#vakata-contextmenu .right { right:100%; left:auto; } ' + \r
+                       '#vakata-contextmenu .bottom { bottom:-1px; top:auto; } ' + \r
+                       '#vakata-contextmenu li.vakata-separator { min-height:0; height:1px; line-height:1px; font-size:1px; overflow:hidden; margin:0 2px; background:silver; /* border-top:1px solid #fefefe; */ padding:0; } ';\r
+               $.vakata.css.add_sheet({ str : css_string });\r
+               $.vakata.context.cnt\r
+                       .delegate("a","click", function (e) { e.preventDefault(); })\r
+                       .delegate("a","mouseup", function (e) {\r
+                               if(!$(this).parent().hasClass("jstree-contextmenu-disabled") && $.vakata.context.exec($(this).attr("rel"))) {\r
+                                       $.vakata.context.hide();\r
+                               }\r
+                               else { $(this).blur(); }\r
+                       })\r
+                       .delegate("a","mouseover", function () {\r
+                               $.vakata.context.cnt.find(".vakata-hover").removeClass("vakata-hover");\r
+                       })\r
+                       .appendTo("body");\r
+               $(document).bind("mousedown", function (e) { if($.vakata.context.vis && !$.contains($.vakata.context.cnt[0], e.target)) { $.vakata.context.hide(); } });\r
+               if(typeof $.hotkeys !== "undefined") {\r
+                       $(document)\r
+                               .bind("keydown", "up", function (e) { \r
+                                       if($.vakata.context.vis) { \r
+                                               var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").prevAll("li:not(.vakata-separator)").first();\r
+                                               if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").last(); }\r
+                                               o.addClass("vakata-hover");\r
+                                               e.stopImmediatePropagation(); \r
+                                               e.preventDefault();\r
+                                       } \r
+                               })\r
+                               .bind("keydown", "down", function (e) { \r
+                                       if($.vakata.context.vis) { \r
+                                               var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").nextAll("li:not(.vakata-separator)").first();\r
+                                               if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").first(); }\r
+                                               o.addClass("vakata-hover");\r
+                                               e.stopImmediatePropagation(); \r
+                                               e.preventDefault();\r
+                                       } \r
+                               })\r
+                               .bind("keydown", "right", function (e) { \r
+                                       if($.vakata.context.vis) { \r
+                                               $.vakata.context.cnt.find(".vakata-hover").children("ul").show().children("li:not(.vakata-separator)").removeClass("vakata-hover").first().addClass("vakata-hover");\r
+                                               e.stopImmediatePropagation(); \r
+                                               e.preventDefault();\r
+                                       } \r
+                               })\r
+                               .bind("keydown", "left", function (e) { \r
+                                       if($.vakata.context.vis) { \r
+                                               $.vakata.context.cnt.find(".vakata-hover").children("ul").hide().children(".vakata-separator").removeClass("vakata-hover");\r
+                                               e.stopImmediatePropagation(); \r
+                                               e.preventDefault();\r
+                                       } \r
+                               })\r
+                               .bind("keydown", "esc", function (e) { \r
+                                       $.vakata.context.hide(); \r
+                                       e.preventDefault();\r
+                               })\r
+                               .bind("keydown", "space", function (e) { \r
+                                       $.vakata.context.cnt.find(".vakata-hover").last().children("a").click();\r
+                                       e.preventDefault();\r
+                               });\r
+               }\r
+       });\r
+\r
+       $.jstree.plugin("contextmenu", {\r
+               __init : function () {\r
+                       this.get_container()\r
+                               .delegate("a", "contextmenu.jstree", $.proxy(function (e) {\r
+                                               e.preventDefault();\r
+                                               this.show_contextmenu(e.currentTarget, e.pageX, e.pageY);\r
+                                       }, this))\r
+                               .bind("destroy.jstree", $.proxy(function () {\r
+                                               if(this.data.contextmenu) {\r
+                                                       $.vakata.context.hide();\r
+                                               }\r
+                                       }, this));\r
+                       $(document).bind("context_hide.vakata", $.proxy(function () { this.data.contextmenu = false; }, this));\r
+               },\r
+               defaults : { \r
+                       select_node : false, // requires UI plugin\r
+                       show_at_node : true,\r
+                       items : { // Could be a function that should return an object like this one\r
+                               "create" : {\r
+                                       "separator_before"      : false,\r
+                                       "separator_after"       : true,\r
+                                       "label"                         : "Create",\r
+                                       "action"                        : function (obj) { this.create(obj); }\r
+                               },\r
+                               "rename" : {\r
+                                       "separator_before"      : false,\r
+                                       "separator_after"       : false,\r
+                                       "label"                         : "Rename",\r
+                                       "action"                        : function (obj) { this.rename(obj); }\r
+                               },\r
+                               "remove" : {\r
+                                       "separator_before"      : false,\r
+                                       "icon"                          : false,\r
+                                       "separator_after"       : false,\r
+                                       "label"                         : "Delete",\r
+                                       "action"                        : function (obj) { this.remove(obj); }\r
+                               },\r
+                               "ccp" : {\r
+                                       "separator_before"      : true,\r
+                                       "icon"                          : false,\r
+                                       "separator_after"       : false,\r
+                                       "label"                         : "Edit",\r
+                                       "action"                        : false,\r
+                                       "submenu" : { \r
+                                               "cut" : {\r
+                                                       "separator_before"      : false,\r
+                                                       "separator_after"       : false,\r
+                                                       "label"                         : "Cut",\r
+                                                       "action"                        : function (obj) { this.cut(obj); }\r
+                                               },\r
+                                               "copy" : {\r
+                                                       "separator_before"      : false,\r
+                                                       "icon"                          : false,\r
+                                                       "separator_after"       : false,\r
+                                                       "label"                         : "Copy",\r
+                                                       "action"                        : function (obj) { this.copy(obj); }\r
+                                               },\r
+                                               "paste" : {\r
+                                                       "separator_before"      : false,\r
+                                                       "icon"                          : false,\r
+                                                       "separator_after"       : false,\r
+                                                       "label"                         : "Paste",\r
+                                                       "action"                        : function (obj) { this.paste(obj); }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               },\r
+               _fn : {\r
+                       show_contextmenu : function (obj, x, y) {\r
+                               obj = this._get_node(obj);\r
+                               var s = this.get_settings().contextmenu,\r
+                                       a = obj.children("a:visible:eq(0)"),\r
+                                       o = false;\r
+                               if(s.select_node && this.data.ui && !this.is_selected(obj)) {\r
+                                       this.deselect_all();\r
+                                       this.select_node(obj, true);\r
+                               }\r
+                               if(s.show_at_node || typeof x === "undefined" || typeof y === "undefined") {\r
+                                       o = a.offset();\r
+                                       x = o.left;\r
+                                       y = o.top + this.data.core.li_height;\r
+                               }\r
+                               if($.isFunction(s.items)) { s.items = s.items.call(this, obj); }\r
+                               this.data.contextmenu = true;\r
+                               $.vakata.context.show(s.items, a, x, y, this, obj);\r
+                               if(this.data.themes) { $.vakata.context.cnt.attr("class", "jstree-" + this.data.themes.theme + "-context"); }\r
+                       }\r
+               }\r
+       });\r
+})(jQuery);\r
+//*/\r
+\r
+/* \r
+ * jsTree types plugin 1.0\r
+ * Adds support types of nodes\r
+ * You can set an attribute on each li node, that represents its type.\r
+ * According to the type setting the node may get custom icon/validation rules\r
+ */\r
+(function ($) {\r
+       $.jstree.plugin("types", {\r
+               __init : function () {\r
+                       var s = this._get_settings().types;\r
+                       this.data.types.attach_to = [];\r
+                       this.get_container()\r
+                               .bind("init.jstree", $.proxy(function () { \r
+                                               var types = s.types, \r
+                                                       attr  = s.type_attr, \r
+                                                       icons_css = "", \r
+                                                       _this = this;\r
+\r
+                                               $.each(types, function (i, tp) {\r
+                                                       $.each(tp, function (k, v) { \r
+                                                               if(!/^(max_depth|max_children|icon|valid_children)$/.test(k)) { _this.data.types.attach_to.push(k); }\r
+                                                       });\r
+                                                       if(!tp.icon) { return true; }\r
+                                                       if( tp.icon.image || tp.icon.position) {\r
+                                                               if(i == "default")      { icons_css += '.jstree-' + _this.get_index() + ' a > .jstree-icon { '; }\r
+                                                               else                            { icons_css += '.jstree-' + _this.get_index() + ' li[' + attr + '=' + i + '] > a > .jstree-icon { '; }\r
+                                                               if(tp.icon.image)       { icons_css += ' background-image:url(' + tp.icon.image + '); '; }\r
+                                                               if(tp.icon.position){ icons_css += ' background-position:' + tp.icon.position + '; '; }\r
+                                                               else                            { icons_css += ' background-position:0 0; '; }\r
+                                                               icons_css += '} ';\r
+                                                       }\r
+                                               });\r
+                                               if(icons_css != "") { $.vakata.css.add_sheet({ 'str' : icons_css }); }\r
+                                       }, this))\r
+                               .bind("before.jstree", $.proxy(function (e, data) { \r
+                                               if($.inArray(data.func, this.data.types.attach_to) !== -1) {\r
+                                                       var s = this._get_settings().types.types,\r
+                                                               t = this._get_type(data.args[0]);\r
+                                                       if(\r
+                                                               ( \r
+                                                                       (s[t] && typeof s[t][data.func] !== "undefined") || \r
+                                                                       (s["default"] && typeof s["default"][data.func] !== "undefined")\r
+                                                               ) && !this._check(data.func, data.args[0])\r
+                                                       ) {\r
+                                                               e.stopImmediatePropagation();\r
+                                                               return false;\r
+                                                       }\r
+                                               }\r
+                                       }, this));\r
+               },\r
+               defaults : {\r
+                       // defines maximum number of root nodes (-1 means unlimited, -2 means disable max_children checking)\r
+                       max_children            : -1,\r
+                       // defines the maximum depth of the tree (-1 means unlimited, -2 means disable max_depth checking)\r
+                       max_depth                       : -1,\r
+                       // defines valid node types for the root nodes\r
+                       valid_children          : "all",\r
+\r
+                       // where is the type stores (the rel attribute of the LI element)\r
+                       type_attr : "rel",\r
+                       // a list of types\r
+                       types : {\r
+                               // the default type\r
+                               "default" : {\r
+                                       "max_children"  : -1,\r
+                                       "max_depth"             : -1,\r
+                                       "valid_children": "all"\r
+\r
+                                       // Bound functions - you can bind any other function here (using boolean or function)\r
+                                       //"select_node" : true,\r
+                                       //"open_node"   : true,\r
+                                       //"close_node"  : true,\r
+                                       //"create_node" : true,\r
+                                       //"delete_node" : true\r
+                               }\r
+                       }\r
+               },\r
+               _fn : {\r
+                       _get_type : function (obj) {\r
+                               obj = this._get_node(obj);\r
+                               return (!obj || !obj.length) ? false : obj.attr(this._get_settings().types.type_attr) || "default";\r
+                       },\r
+                       set_type : function (str, obj) {\r
+                               obj = this._get_node(obj);\r
+                               return (!obj.length || !str) ? false : obj.attr(this._get_settings().types.type_attr, str);\r
+                       },\r
+                       _check : function (rule, obj, opts) {\r
+                               var v = false, t = this._get_type(obj), d = 0, _this = this, s = this._get_settings().types;\r
+                               if(obj === -1) { \r
+                                       if(!!s[rule]) { v = s[rule]; }\r
+                                       else { return; }\r
+                               }\r
+                               else {\r
+                                       if(t === false) { return; }\r
+                                       if(!!s.types[t] && !!s.types[t][rule]) { v = s.types[t][rule]; }\r
+                                       else if(!!s.types["default"] && !!s.types["default"][rule]) { v = s.types["default"][rule]; }\r
+                               }\r
+                               if($.isFunction(v)) { v = v.call(this, obj); }\r
+                               if(rule === "max_depth" && obj !== -1 && opts !== false && s.max_depth !== -2 && v !== 0) {\r
+                                       // also include the node itself - otherwise if root node it is not checked\r
+                                       this._get_node(obj).children("a:eq(0)").parentsUntil(".jstree","li").each(function (i) {\r
+                                               // check if current depth already exceeds global tree depth\r
+                                               if(s.max_depth !== -1 && s.max_depth - (i + 1) <= 0) { v = 0; return false; }\r
+                                               d = (i === 0) ? v : _this._check(rule, this, false);\r
+                                               // check if current node max depth is already matched or exceeded\r
+                                               if(d !== -1 && d - (i + 1) <= 0) { v = 0; return false; }\r
+                                               // otherwise - set the max depth to the current value minus current depth\r
+                                               if(d >= 0 && (d - (i + 1) < v || v < 0) ) { v = d - (i + 1); }\r
+                                               // if the global tree depth exists and it minus the nodes calculated so far is less than `v` or `v` is unlimited\r
+                                               if(s.max_depth >= 0 && (s.max_depth - (i + 1) < v || v < 0) ) { v = s.max_depth - (i + 1); }\r
+                                       });\r
+                               }\r
+                               return v;\r
+                       },\r
+                       check_move : function () {\r
+                               if(!this.__call_old()) { return false; }\r
+                               var m  = this._get_move(),\r
+                                       s  = m.rt._get_settings().types,\r
+                                       mc = m.rt._check("max_children", m.cr),\r
+                                       md = m.rt._check("max_depth", m.cr),\r
+                                       vc = m.rt._check("valid_children", m.cr),\r
+                                       ch = 0, d = 1, t;\r
+\r
+                               if(vc === "none") { return false; } \r
+                               if($.isArray(vc) && m.ot && m.ot._get_type) {\r
+                                       m.o.each(function () {\r
+                                               if($.inArray(m.ot._get_type(this), vc) === -1) { d = false; return false; }\r
+                                       });\r
+                                       if(d === false) { return false; }\r
+                               }\r
+                               if(s.max_children !== -2 && mc !== -1) {\r
+                                       ch = m.cr === -1 ? this.get_container().children("> ul > li").not(m.o).length : m.cr.children("> ul > li").not(m.o).length;\r
+                                       if(ch + m.o.length > mc) { return false; }\r
+                               }\r
+                               if(s.max_depth !== -2 && md !== -1) {\r
+                                       d = 0;\r
+                                       if(md === 0) { return false; }\r
+                                       if(typeof m.o.d === "undefined") {\r
+                                               // TODO: deal with progressive rendering and async when checking max_depth (how to know the depth of the moved node)\r
+                                               t = m.o;\r
+                                               while(t.length > 0) {\r
+                                                       t = t.find("> ul > li");\r
+                                                       d ++;\r
+                                               }\r
+                                               m.o.d = d;\r
+                                       }\r
+                                       if(md - m.o.d < 0) { return false; }\r
+                               }\r
+                               return true;\r
+                       },\r
+                       create_node : function (obj, position, js, callback, is_loaded, skip_check) {\r
+                               if(!skip_check && (is_loaded || this._is_loaded(obj))) {\r
+                                       var p  = (position && position.match(/^before|after$/i) && obj !== -1) ? this._get_parent(obj) : this._get_node(obj),\r
+                                               s  = this._get_settings().types,\r
+                                               mc = this._check("max_children", p),\r
+                                               md = this._check("max_depth", p),\r
+                                               vc = this._check("valid_children", p),\r
+                                               ch;\r
+                                       if(!js) { js = {}; }\r
+                                       if(vc === "none") { return false; } \r
+                                       if($.isArray(vc)) {\r
+                                               if(!js.attr || !js.attr[s.type_attr]) { \r
+                                                       if(!js.attr) { js.attr = {}; }\r
+                                                       js.attr[s.type_attr] = vc[0]; \r
+                                               }\r
+                                               else {\r
+                                                       if($.inArray(js.attr[s.type_attr], vc) === -1) { return false; }\r
+                                               }\r
+                                       }\r
+                                       if(s.max_children !== -2 && mc !== -1) {\r
+                                               ch = p === -1 ? this.get_container().children("> ul > li").length : p.children("> ul > li").length;\r
+                                               if(ch + 1 > mc) { return false; }\r
+                                       }\r
+                                       if(s.max_depth !== -2 && md !== -1 && (md - 1) < 0) { return false; }\r
+                               }\r
+                               return this.__call_old(true, obj, position, js, callback, is_loaded, skip_check);\r
+                       }\r
+               }\r
+       });\r
+})(jQuery);\r
+//*/\r
+\r
+/* \r
+ * jsTree HTML data 1.0\r
+ * The HTML data store. Datastores are build by replacing the `load_node` and `_is_loaded` functions.\r
+ */\r
+(function ($) {\r
+       $.jstree.plugin("html_data", {\r
+               __init : function () { \r
+                       // this used to use html() and clean the whitespace, but this way any attached data was lost\r
+                       this.data.html_data.original_container_html = this.get_container().find(" > ul > li").clone(true);\r
+                       // remove white space from LI node - otherwise nodes appear a bit to the right\r
+                       this.data.html_data.original_container_html.find("li").andSelf().contents().filter(function() { return this.nodeType == 3; }).remove();\r
+               },\r
+               defaults : { \r
+                       data : false,\r
+                       ajax : false,\r
+                       correct_state : true\r
+               },\r
+               _fn : {\r
+                       load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_html(obj, function () { _this.__callback({ "obj" : obj }); s_call.call(this); }, e_call); },\r
+                       _is_loaded : function (obj) { \r
+                               obj = this._get_node(obj); \r
+                               return obj == -1 || !obj || !this._get_settings().html_data.ajax || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;\r
+                       },\r
+                       load_node_html : function (obj, s_call, e_call) {\r
+                               var d,\r
+                                       s = this.get_settings().html_data,\r
+                                       error_func = function () {},\r
+                                       success_func = function () {};\r
+                               obj = this._get_node(obj);\r
+                               if(obj && obj !== -1) {\r
+                                       if(obj.data("jstree-is-loading")) { return; }\r
+                                       else { obj.data("jstree-is-loading",true); }\r
+                               }\r
+                               switch(!0) {\r
+                                       case (!s.data && !s.ajax):\r
+                                               if(!obj || obj == -1) {\r
+                                                       this.get_container()\r
+                                                               .children("ul").empty()\r
+                                                               .append(this.data.html_data.original_container_html)\r
+                                                               .find("li, a").filter(function () { return this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end()\r
+                                                               .filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon");\r
+                                                       this.clean_node();\r
+                                               }\r
+                                               if(s_call) { s_call.call(this); }\r
+                                               break;\r
+                                       case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):\r
+                                               if(!obj || obj == -1) {\r
+                                                       d = $(s.data);\r
+                                                       if(!d.is("ul")) { d = $("<ul>").append(d); }\r
+                                                       this.get_container()\r
+                                                               .children("ul").empty().append(d.children())\r
+                                                               .find("li, a").filter(function () { return this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end()\r
+                                                               .filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon");\r
+                                                       this.clean_node();\r
+                                               }\r
+                                               if(s_call) { s_call.call(this); }\r
+                                               break;\r
+                                       case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):\r
+                                               obj = this._get_node(obj);\r
+                                               error_func = function (x, t, e) {\r
+                                                       var ef = this.get_settings().html_data.ajax.error; \r
+                                                       if(ef) { ef.call(this, x, t, e); }\r
+                                                       if(obj != -1 && obj.length) {\r
+                                                               obj.children(".jstree-loading").removeClass("jstree-loading");\r
+                                                               obj.data("jstree-is-loading",false);\r
+                                                               if(t === "success" && s.correct_state) { obj.removeClass("jstree-open jstree-closed").addClass("jstree-leaf"); }\r
+                                                       }\r
+                                                       else {\r
+                                                               if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }\r
+                                                       }\r
+                                                       if(e_call) { e_call.call(this); }\r
+                                               };\r
+                                               success_func = function (d, t, x) {\r
+                                                       var sf = this.get_settings().html_data.ajax.success; \r
+                                                       if(sf) { d = sf.call(this,d,t,x) || d; }\r
+                                                       if(d == "") {\r
+                                                               return error_func.call(this, x, t, "");\r
+                                                       }\r
+                                                       if(d) {\r
+                                                               d = $(d);\r
+                                                               if(!d.is("ul")) { d = $("<ul>").append(d); }\r
+                                                               if(obj == -1 || !obj) { this.get_container().children("ul").empty().append(d.children()).find("li, a").filter(function () { return this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); }\r
+                                                               else { obj.children(".jstree-loading").removeClass("jstree-loading"); obj.append(d).find("li, a").filter(function () { return this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); obj.data("jstree-is-loading",false); }\r
+                                                               this.clean_node(obj);\r
+                                                               if(s_call) { s_call.call(this); }\r
+                                                       }\r
+                                                       else {\r
+                                                               if(obj && obj !== -1) {\r
+                                                                       obj.children(".jstree-loading").removeClass("jstree-loading");\r
+                                                                       obj.data("jstree-is-loading",false);\r
+                                                                       if(s.correct_state) { \r
+                                                                               obj.removeClass("jstree-open jstree-closed").addClass("jstree-leaf"); \r
+                                                                               if(s_call) { s_call.call(this); } \r
+                                                                       }\r
+                                                               }\r
+                                                               else {\r
+                                                                       if(s.correct_state) { \r
+                                                                               this.get_container().children("ul").empty();\r
+                                                                               if(s_call) { s_call.call(this); } \r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                               };\r
+                                               s.ajax.context = this;\r
+                                               s.ajax.error = error_func;\r
+                                               s.ajax.success = success_func;\r
+                                               if(!s.ajax.dataType) { s.ajax.dataType = "html"; }\r
+                                               if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }\r
+                                               if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }\r
+                                               $.ajax(s.ajax);\r
+                                               break;\r
+                               }\r
+                       }\r
+               }\r
+       });\r
+       // include the HTML data plugin by default\r
+       $.jstree.defaults.plugins.push("html_data");\r
+})(jQuery);\r
+//*/\r
+\r
+/* \r
+ * jsTree themeroller plugin 1.0\r
+ * Adds support for jQuery UI themes. Include this at the end of your plugins list, also make sure "themes" is not included.\r
+ */\r
+(function ($) {\r
+       $.jstree.plugin("themeroller", {\r
+               __init : function () {\r
+                       var s = this._get_settings().themeroller;\r
+                       this.get_container()\r
+                               .addClass("ui-widget-content")\r
+                               .delegate("a","mouseenter.jstree", function () {\r
+                                       $(this).addClass(s.item_h);\r
+                               })\r
+                               .delegate("a","mouseleave.jstree", function () {\r
+                                       $(this).removeClass(s.item_h);\r
+                               })\r
+                               .bind("open_node.jstree create_node.jstree", $.proxy(function (e, data) { \r
+                                               this._themeroller(data.rslt.obj);\r
+                                       }, this))\r
+                               .bind("loaded.jstree refresh.jstree", $.proxy(function (e) {\r
+                                               this._themeroller();\r
+                                       }, this))\r
+                               .bind("close_node.jstree", $.proxy(function (e, data) {\r
+                                               data.rslt.obj.children("ins").removeClass(s.opened).addClass(s.closed);\r
+                                       }, this))\r
+                               .bind("select_node.jstree", $.proxy(function (e, data) {\r
+                                               data.rslt.obj.children("a").addClass(s.item_a);\r
+                                       }, this))\r
+                               .bind("deselect_node.jstree deselect_all.jstree", $.proxy(function (e, data) {\r
+                                               this.get_container()\r
+                                                       .find("." + s.item_a).removeClass(s.item_a).end()\r
+                                                       .find(".jstree-clicked").addClass(s.item_a);\r
+                                       }, this))\r
+                               .bind("move_node.jstree", $.proxy(function (e, data) {\r
+                                               this._themeroller(data.rslt.o);\r
+                                       }, this));\r
+               },\r
+               __destroy : function () {\r
+                       var s = this._get_settings().themeroller,\r
+                               c = [ "ui-icon" ];\r
+                       $.each(s, function (i, v) {\r
+                               v = v.split(" ");\r
+                               if(v.length) { c = c.concat(v); }\r
+                       });\r
+                       this.get_container()\r
+                               .removeClass("ui-widget-content")\r
+                               .find("." + c.join(", .")).removeClass(c.join(" "));\r
+               },\r
+               _fn : {\r
+                       _themeroller : function (obj) {\r
+                               var s = this._get_settings().themeroller;\r
+                               obj = !obj || obj == -1 ? this.get_container() : this._get_node(obj).parent();\r
+                               obj\r
+                                       .find("li.jstree-closed > ins.jstree-icon").removeClass(s.opened).addClass("ui-icon " + s.closed).end()\r
+                                       .find("li.jstree-open > ins.jstree-icon").removeClass(s.closed).addClass("ui-icon " + s.opened).end()\r
+                                       .find("a").addClass(s.item)\r
+                                               .children("ins.jstree-icon").addClass("ui-icon " + s.item_icon);\r
+                       }\r
+               },\r
+               defaults : {\r
+                       "opened" : "ui-icon-triangle-1-se",\r
+                       "closed" : "ui-icon-triangle-1-e",\r
+                       "item" : "ui-state-default",\r
+                       "item_h" : "ui-state-hover",\r
+                       "item_a" : "ui-state-active",\r
+                       "item_icon" : "ui-icon-folder-collapsed"\r
+               }\r
+       });\r
+       $(function() {\r
+               var css_string = '.jstree .ui-icon { overflow:visible; } .jstree a { padding:0 2px; }';\r
+               $.vakata.css.add_sheet({ str : css_string });\r
+       });\r
+})(jQuery);\r
+//*/\r
+\r
+/* \r
+ * jsTree unique plugin 1.0\r
+ * Forces different names amongst siblings (still a bit experimental)\r
+ * NOTE: does not check language versions (it will not be possible to have nodes with the same title, even in different languages)\r
+ */\r
+(function ($) {\r
+       $.jstree.plugin("unique", {\r
+               __init : function () {\r
+                       this.get_container()\r
+                               .bind("before.jstree", $.proxy(function (e, data) { \r
+                                               var nms = [], res = true, p, t;\r
+                                               if(data.func == "move_node") {\r
+                                                       // obj, ref, position, is_copy, is_prepared, skip_check\r
+                                                       if(data.args[4] === true) {\r
+                                                               if(data.args[0].o && data.args[0].o.length) {\r
+                                                                       data.args[0].o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); });\r
+                                                                       res = this._check_unique(nms, data.args[0].np.find("> ul > li").not(data.args[0].o));\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                               if(data.func == "create_node") {\r
+                                                       // obj, position, js, callback, is_loaded\r
+                                                       if(data.args[4] || this._is_loaded(data.args[0])) {\r
+                                                               p = this._get_node(data.args[0]);\r
+                                                               if(data.args[1] && (data.args[1] === "before" || data.args[1] === "after")) {\r
+                                                                       p = this._get_parent(data.args[0]);\r
+                                                                       if(!p || p === -1) { p = this.get_container(); }\r
+                                                               }\r
+                                                               if(typeof data.args[2] === "string") { nms.push(data.args[2]); }\r
+                                                               else if(!data.args[2] || !data.args[2].data) { nms.push(this._get_settings().core.strings.new_node); }\r
+                                                               else { nms.push(data.args[2].data); }\r
+                                                               res = this._check_unique(nms, p.find("> ul > li"));\r
+                                                       }\r
+                                               }\r
+                                               if(data.func == "rename_node") {\r
+                                                       // obj, val\r
+                                                       nms.push(data.args[1]);\r
+                                                       t = this._get_node(data.args[0]);\r
+                                                       p = this._get_parent(t);\r
+                                                       if(!p || p === -1) { p = this.get_container(); }\r
+                                                       res = this._check_unique(nms, p.find("> ul > li").not(t));\r
+                                               }\r
+                                               if(!res) {\r
+                                                       e.stopPropagation();\r
+                                                       return false;\r
+                                               }\r
+                                       }, this));\r
+               },\r
+               _fn : { \r
+                       _check_unique : function (nms, p) {\r
+                               var cnms = [];\r
+                               p.children("a").each(function () { cnms.push($(this).text().replace(/^\s+/g,"")); });\r
+                               if(!cnms.length || !nms.length) { return true; }\r
+                               cnms = cnms.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");\r
+                               if((cnms.length + nms.length) != cnms.concat(nms).sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",").length) {\r
+                                       return false;\r
+                               }\r
+                               return true;\r
+                       },\r
+                       check_move : function () {\r
+                               if(!this.__call_old()) { return false; }\r
+                               var p = this._get_move(), nms = [];\r
+                               if(p.o && p.o.length) {\r
+                                       p.o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); });\r
+                                       return this._check_unique(nms, p.np.find("> ul > li").not(p.o));\r
+                               }\r
+                               return true;\r
+                       }\r
+               }\r
+       });\r
+})(jQuery);\r
+//*/
\ No newline at end of file
diff --git a/www/js/themes/apple/bg.jpg b/www/js/themes/apple/bg.jpg
new file mode 100644 (file)
index 0000000..3aad05d
Binary files /dev/null and b/www/js/themes/apple/bg.jpg differ
diff --git a/www/js/themes/apple/d.png b/www/js/themes/apple/d.png
new file mode 100644 (file)
index 0000000..2463ba6
Binary files /dev/null and b/www/js/themes/apple/d.png differ
diff --git a/www/js/themes/apple/dot_for_ie.gif b/www/js/themes/apple/dot_for_ie.gif
new file mode 100644 (file)
index 0000000..c0cc5fd
Binary files /dev/null and b/www/js/themes/apple/dot_for_ie.gif differ
diff --git a/www/js/themes/apple/style.css b/www/js/themes/apple/style.css
new file mode 100644 (file)
index 0000000..8f1b3de
--- /dev/null
@@ -0,0 +1,60 @@
+/*\r
+ * jsTree apple theme 1.0\r
+ * Supported features: dots/no-dots, icons/no-icons, focused, loading\r
+ * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search\r
+ */\r
+\r
+.jstree-apple > ul { background:url("bg.jpg") left top repeat; }\r
+.jstree-apple li, \r
+.jstree-apple ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; }\r
+.jstree-apple li { background-position:-90px 0; background-repeat:repeat-y;  }\r
+.jstree-apple li.jstree-last { background:transparent; }\r
+.jstree-apple .jstree-open > ins { background-position:-72px 0; }\r
+.jstree-apple .jstree-closed > ins { background-position:-54px 0; }\r
+.jstree-apple .jstree-leaf > ins { background-position:-36px 0; }\r
+\r
+.jstree-apple a { border-radius:4px; -moz-border-radius:4px; -webkit-border-radius:4px; text-shadow:1px 1px 1px white; }\r
+.jstree-apple .jstree-hovered { background:#e7f4f9; border:1px solid #d8f0fa; padding:0 3px 0 1px; text-shadow:1px 1px 1px silver; }\r
+.jstree-apple .jstree-clicked { background:#beebff; border:1px solid #99defd; padding:0 3px 0 1px; }\r
+.jstree-apple a .jstree-icon { background-position:-56px -20px; }\r
+.jstree-apple a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; }\r
+\r
+.jstree-apple.jstree-focused { background:white; }\r
+\r
+.jstree-apple .jstree-no-dots li, \r
+.jstree-apple .jstree-no-dots .jstree-leaf > ins { background:transparent; }\r
+.jstree-apple .jstree-no-dots .jstree-open > ins { background-position:-18px 0; }\r
+.jstree-apple .jstree-no-dots .jstree-closed > ins { background-position:0 0; }\r
+\r
+.jstree-apple .jstree-no-icons a .jstree-icon { display:none; }\r
+\r
+.jstree-apple .jstree-search { font-style:italic; }\r
+\r
+.jstree-apple .jstree-no-icons .jstree-checkbox { display:inline-block; }\r
+.jstree-apple .jstree-no-checkboxes .jstree-checkbox { display:none !important; }\r
+.jstree-apple .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; }\r
+.jstree-apple .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; }\r
+.jstree-apple .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; }\r
+.jstree-apple .jstree-checked > a > .checkbox:hover { background-position:-38px -37px; }\r
+.jstree-apple .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; }\r
+.jstree-apple .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; }\r
+\r
+#vakata-dragged.jstree-apple ins { background:transparent !important; }\r
+#vakata-dragged.jstree-apple .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; }\r
+#vakata-dragged.jstree-apple .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; }\r
+#jstree-marker.jstree-apple { background:url("d.png") -41px -57px no-repeat !important; }\r
+\r
+.jstree-apple a.jstree-search { color:aqua; }\r
+\r
+#vakata-contextmenu.jstree-apple-context, \r
+#vakata-contextmenu.jstree-apple-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; }\r
+#vakata-contextmenu.jstree-apple-context li { }\r
+#vakata-contextmenu.jstree-apple-context a { color:black; }\r
+#vakata-contextmenu.jstree-apple-context a:hover, \r
+#vakata-contextmenu.jstree-apple-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; }\r
+#vakata-contextmenu.jstree-apple-context li.jstree-contextmenu-disabled a, \r
+#vakata-contextmenu.jstree-apple-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; }\r
+#vakata-contextmenu.jstree-apple-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; }\r
+#vakata-contextmenu.jstree-apple-context li ul { margin-left:-4px; }\r
+\r
+/* TODO: IE6 support - the `>` selectors */
\ No newline at end of file
diff --git a/www/js/themes/apple/throbber.gif b/www/js/themes/apple/throbber.gif
new file mode 100644 (file)
index 0000000..5b33f7e
Binary files /dev/null and b/www/js/themes/apple/throbber.gif differ
diff --git a/www/js/themes/classic/d.png b/www/js/themes/classic/d.png
new file mode 100644 (file)
index 0000000..275daec
Binary files /dev/null and b/www/js/themes/classic/d.png differ
diff --git a/www/js/themes/classic/dot_for_ie.gif b/www/js/themes/classic/dot_for_ie.gif
new file mode 100644 (file)
index 0000000..c0cc5fd
Binary files /dev/null and b/www/js/themes/classic/dot_for_ie.gif differ
diff --git a/www/js/themes/classic/style.css b/www/js/themes/classic/style.css
new file mode 100644 (file)
index 0000000..bb15730
--- /dev/null
@@ -0,0 +1,59 @@
+/*\r
+ * jsTree classic theme 1.0\r
+ * Supported features: dots/no-dots, icons/no-icons, focused, loading\r
+ * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search\r
+ */\r
+\r
+.jstree-classic li, \r
+.jstree-classic ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; }\r
+.jstree-classic li { background-position:-90px 0; background-repeat:repeat-y;  }\r
+.jstree-classic li.jstree-last { background:transparent; }\r
+.jstree-classic .jstree-open > ins { background-position:-72px 0; }\r
+.jstree-classic .jstree-closed > ins { background-position:-54px 0; }\r
+.jstree-classic .jstree-leaf > ins { background-position:-36px 0; }\r
+\r
+.jstree-classic .jstree-hovered { background:#e7f4f9; border:1px solid #e7f4f9; padding:0 2px 0 1px; }\r
+.jstree-classic .jstree-clicked { background:navy; border:1px solid navy; padding:0 2px 0 1px; color:white; }\r
+.jstree-classic a .jstree-icon { background-position:-56px -19px; }\r
+.jstree-classic .jstree-open > a .jstree-icon { background-position:-56px -36px; }\r
+.jstree-classic a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; }\r
+\r
+.jstree-classic.jstree-focused { background:white; }\r
+\r
+.jstree-classic .jstree-no-dots li, \r
+.jstree-classic .jstree-no-dots .jstree-leaf > ins { background:transparent; }\r
+.jstree-classic .jstree-no-dots .jstree-open > ins { background-position:-18px 0; }\r
+.jstree-classic .jstree-no-dots .jstree-closed > ins { background-position:0 0; }\r
+\r
+.jstree-classic .jstree-no-icons a .jstree-icon { display:none; }\r
+\r
+.jstree-classic .jstree-search { font-style:italic; }\r
+\r
+.jstree-classic .jstree-no-icons .jstree-checkbox { display:inline-block; }\r
+.jstree-classic .jstree-no-checkboxes .jstree-checkbox { display:none !important; }\r
+.jstree-classic .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; }\r
+.jstree-classic .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; }\r
+.jstree-classic .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; }\r
+.jstree-classic .jstree-checked > a > .jstree-checkbox:hover { background-position:-38px -37px; }\r
+.jstree-classic .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; }\r
+.jstree-classic .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; }\r
+\r
+#vakata-dragged.jstree-classic ins { background:transparent !important; }\r
+#vakata-dragged.jstree-classic .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; }\r
+#vakata-dragged.jstree-classic .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; }\r
+#jstree-marker.jstree-classic { background:url("d.png") -41px -57px no-repeat !important; }\r
+\r
+.jstree-classic a.jstree-search { color:aqua; }\r
+\r
+#vakata-contextmenu.jstree-classic-context, \r
+#vakata-contextmenu.jstree-classic-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; }\r
+#vakata-contextmenu.jstree-classic-context li { }\r
+#vakata-contextmenu.jstree-classic-context a { color:black; }\r
+#vakata-contextmenu.jstree-classic-context a:hover, \r
+#vakata-contextmenu.jstree-classic-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; }\r
+#vakata-contextmenu.jstree-classic-context li.jstree-contextmenu-disabled a, \r
+#vakata-contextmenu.jstree-classic-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; }\r
+#vakata-contextmenu.jstree-classic-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; }\r
+#vakata-contextmenu.jstree-classic-context li ul { margin-left:-4px; }\r
+\r
+/* TODO: IE6 support - the `>` selectors */
\ No newline at end of file
diff --git a/www/js/themes/classic/throbber.gif b/www/js/themes/classic/throbber.gif
new file mode 100644 (file)
index 0000000..5b33f7e
Binary files /dev/null and b/www/js/themes/classic/throbber.gif differ
diff --git a/www/js/themes/default-rtl/d.gif b/www/js/themes/default-rtl/d.gif
new file mode 100644 (file)
index 0000000..d85aba0
Binary files /dev/null and b/www/js/themes/default-rtl/d.gif differ
diff --git a/www/js/themes/default-rtl/d.png b/www/js/themes/default-rtl/d.png
new file mode 100644 (file)
index 0000000..5179cf6
Binary files /dev/null and b/www/js/themes/default-rtl/d.png differ
diff --git a/www/js/themes/default-rtl/dots.gif b/www/js/themes/default-rtl/dots.gif
new file mode 100644 (file)
index 0000000..0043364
Binary files /dev/null and b/www/js/themes/default-rtl/dots.gif differ
diff --git a/www/js/themes/default-rtl/style.css b/www/js/themes/default-rtl/style.css
new file mode 100644 (file)
index 0000000..3ad0727
--- /dev/null
@@ -0,0 +1,83 @@
+/*\r
+ * jsTree default-rtl theme 1.0\r
+ * Supported features: dots/no-dots, icons/no-icons, focused, loading\r
+ * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search\r
+ */\r
+\r
+.jstree-default-rtl li, \r
+.jstree-default-rtl ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; }\r
+.jstree-default-rtl li { background-position:-90px 0; background-repeat:repeat-y; }\r
+.jstree-default-rtl li.jstree-last { background:transparent; }\r
+.jstree-default-rtl .jstree-open > ins { background-position:-72px 0; }\r
+.jstree-default-rtl .jstree-closed > ins { background-position:-54px 0; }\r
+.jstree-default-rtl .jstree-leaf > ins { background-position:-36px 0; }\r
+\r
+.jstree-default-rtl .jstree-hovered { background:#e7f4f9; border:1px solid #d8f0fa; padding:0 2px 0 1px; }\r
+.jstree-default-rtl .jstree-clicked { background:#beebff; border:1px solid #99defd; padding:0 2px 0 1px; }\r
+.jstree-default-rtl a .jstree-icon { background-position:-56px -19px; }\r
+.jstree-default-rtl a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; }\r
+\r
+.jstree-default-rtl.jstree-focused { background:#ffffee; }\r
+\r
+.jstree-default-rtl .jstree-no-dots li, \r
+.jstree-default-rtl .jstree-no-dots .jstree-leaf > ins { background:transparent; }\r
+.jstree-default-rtl .jstree-no-dots .jstree-open > ins { background-position:-18px 0; }\r
+.jstree-default-rtl .jstree-no-dots .jstree-closed > ins { background-position:0 0; }\r
+\r
+.jstree-default-rtl .jstree-no-icons a .jstree-icon { display:none; }\r
+\r
+.jstree-default-rtl .jstree-search { font-style:italic; }\r
+\r
+.jstree-default-rtl .jstree-no-icons .jstree-checkbox { display:inline-block; }\r
+.jstree-default-rtl .jstree-no-checkboxes .jstree-checkbox { display:none !important; }\r
+.jstree-default-rtl .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; }\r
+.jstree-default-rtl .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; }\r
+.jstree-default-rtl .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; }\r
+.jstree-default-rtl .jstree-checked > a > .jstree-checkbox:hover { background-position:-38px -37px; }\r
+.jstree-default-rtl .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; }\r
+.jstree-default-rtl .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; }\r
+\r
+#vakata-dragged.jstree-default-rtl ins { background:transparent !important; }\r
+#vakata-dragged.jstree-default-rtl .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; }\r
+#vakata-dragged.jstree-default-rtl .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; }\r
+#jstree-marker.jstree-default-rtl { background:url("d.png") -41px -57px no-repeat !important; }\r
+\r
+.jstree-default-rtl a.jstree-search { color:aqua; }\r
+\r
+#vakata-contextmenu.jstree-default-rtl-context, \r
+#vakata-contextmenu.jstree-default-rtl-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; }\r
+#vakata-contextmenu.jstree-default-rtl-context li { }\r
+#vakata-contextmenu.jstree-default-rtl-context a { color:black; }\r
+#vakata-contextmenu.jstree-default-rtl-context a:hover, \r
+#vakata-contextmenu.jstree-default-rtl-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; }\r
+#vakata-contextmenu.jstree-default-rtl-context li.jstree-contextmenu-disabled a, \r
+#vakata-contextmenu.jstree-default-rtl-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; }\r
+#vakata-contextmenu.jstree-default-rtl-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; }\r
+#vakata-contextmenu.jstree-default-rtl-context li ul { margin-left:-4px; }\r
+\r
+/* IE6 BEGIN */\r
+.jstree-default-rtl li, \r
+.jstree-default-rtl ins,\r
+#vakata-dragged.jstree-default-rtl .jstree-invalid, \r
+#vakata-dragged.jstree-default-rtl .jstree-ok, \r
+#jstree-marker.jstree-default-rtl { _background-image:url("d.gif"); }\r
+.jstree-default-rtl .jstree-open ins { _background-position:-72px 0; }\r
+.jstree-default-rtl .jstree-closed ins { _background-position:-54px 0; }\r
+.jstree-default-rtl .jstree-leaf ins { _background-position:-36px 0; }\r
+.jstree-default-rtl a ins.jstree-icon { _background-position:-56px -19px; }\r
+#vakata-contextmenu.jstree-default-rtl-context ins { _display:none; }\r
+#vakata-contextmenu.jstree-default-rtl-context li { _zoom:1; }\r
+.jstree-default-rtl .jstree-undetermined a .jstree-checkbox { _background-position:-18px -19px; }\r
+.jstree-default-rtl .jstree-checked a .jstree-checkbox { _background-position:-36px -19px; }\r
+.jstree-default-rtl .jstree-unchecked a .jstree-checkbox { _background-position:0px -19px; }\r
+/* IE6 END */\r
+\r
+/* RTL part */\r
+.jstree-default-rtl .jstree-hovered, .jstree-default-rtl .jstree-clicked { padding:0 1px 0 2px; }\r
+.jstree-default-rtl li { background-image:url("dots.gif"); background-position: 100% 0px; }\r
+.jstree-default-rtl .jstree-checked > a > .jstree-checkbox { background-position:-36px -19px; margin-left:2px; }\r
+.jstree-default-rtl .jstree-unchecked > a > .jstree-checkbox { background-position:0px -19px; margin-left:2px; }\r
+.jstree-default-rtl .jstree-undetermined > a > .jstree-checkbox { background-position:-18px -19px; margin-left:2px; }\r
+.jstree-default-rtl .jstree-checked > a > .jstree-checkbox:hover { background-position:-36px -37px; }\r
+.jstree-default-rtl .jstree-unchecked > a > .jstree-checkbox:hover { background-position:0px -37px; }\r
+.jstree-default-rtl .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-18px -37px; }
\ No newline at end of file
diff --git a/www/js/themes/default-rtl/throbber.gif b/www/js/themes/default-rtl/throbber.gif
new file mode 100644 (file)
index 0000000..5b33f7e
Binary files /dev/null and b/www/js/themes/default-rtl/throbber.gif differ
diff --git a/www/js/themes/default/d.gif b/www/js/themes/default/d.gif
new file mode 100644 (file)
index 0000000..0e958d3
Binary files /dev/null and b/www/js/themes/default/d.gif differ
diff --git a/www/js/themes/default/d.png b/www/js/themes/default/d.png
new file mode 100644 (file)
index 0000000..8540175
Binary files /dev/null and b/www/js/themes/default/d.png differ
diff --git a/www/js/themes/default/style.css b/www/js/themes/default/style.css
new file mode 100644 (file)
index 0000000..01a0889
--- /dev/null
@@ -0,0 +1,73 @@
+/*\r
+ * jsTree default theme 1.0\r
+ * Supported features: dots/no-dots, icons/no-icons, focused, loading\r
+ * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search\r
+ */\r
+\r
+.jstree-default li, \r
+.jstree-default ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; }\r
+.jstree-default li { background-position:-90px 0; background-repeat:repeat-y; }\r
+.jstree-default li.jstree-last { background:transparent; }\r
+.jstree-default .jstree-open > ins { background-position:-72px 0; }\r
+.jstree-default .jstree-closed > ins { background-position:-54px 0; }\r
+.jstree-default .jstree-leaf > ins { background-position:-36px 0; }\r
+\r
+.jstree-default .jstree-hovered { background:#e7f4f9; border:1px solid #d8f0fa; padding:0 2px 0 1px; }\r
+.jstree-default .jstree-clicked { background:#beebff; border:1px solid #99defd; padding:0 2px 0 1px; }\r
+.jstree-default a .jstree-icon { background-position:-56px -19px; }\r
+.jstree-default a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; }\r
+\r
+.jstree-default.jstree-focused { background:#ffffee; }\r
+\r
+.jstree-default .jstree-no-dots li, \r
+.jstree-default .jstree-no-dots .jstree-leaf > ins { background:transparent; }\r
+.jstree-default .jstree-no-dots .jstree-open > ins { background-position:-18px 0; }\r
+.jstree-default .jstree-no-dots .jstree-closed > ins { background-position:0 0; }\r
+\r
+.jstree-default .jstree-no-icons a .jstree-icon { display:none; }\r
+\r
+.jstree-default .jstree-search { font-style:italic; }\r
+\r
+.jstree-default .jstree-no-icons .jstree-checkbox { display:inline-block; }\r
+.jstree-default .jstree-no-checkboxes .jstree-checkbox { display:none !important; }\r
+.jstree-default .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; }\r
+.jstree-default .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; }\r
+.jstree-default .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; }\r
+.jstree-default .jstree-checked > a > .jstree-checkbox:hover { background-position:-38px -37px; }\r
+.jstree-default .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; }\r
+.jstree-default .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; }\r
+\r
+#vakata-dragged.jstree-default ins { background:transparent !important; }\r
+#vakata-dragged.jstree-default .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; }\r
+#vakata-dragged.jstree-default .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; }\r
+#jstree-marker.jstree-default { background:url("d.png") -41px -57px no-repeat !important; }\r
+\r
+.jstree-default a.jstree-search { color:aqua; }\r
+\r
+#vakata-contextmenu.jstree-default-context, \r
+#vakata-contextmenu.jstree-default-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; }\r
+#vakata-contextmenu.jstree-default-context li { }\r
+#vakata-contextmenu.jstree-default-context a { color:black; }\r
+#vakata-contextmenu.jstree-default-context a:hover, \r
+#vakata-contextmenu.jstree-default-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; }\r
+#vakata-contextmenu.jstree-default-context li.jstree-contextmenu-disabled a, \r
+#vakata-contextmenu.jstree-default-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; }\r
+#vakata-contextmenu.jstree-default-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; }\r
+#vakata-contextmenu.jstree-default-context li ul { margin-left:-4px; }\r
+\r
+/* IE6 BEGIN */\r
+.jstree-default li, \r
+.jstree-default ins,\r
+#vakata-dragged.jstree-default .jstree-invalid, \r
+#vakata-dragged.jstree-default .jstree-ok, \r
+#jstree-marker.jstree-default { _background-image:url("d.gif"); }\r
+.jstree-default .jstree-open ins { _background-position:-72px 0; }\r
+.jstree-default .jstree-closed ins { _background-position:-54px 0; }\r
+.jstree-default .jstree-leaf ins { _background-position:-36px 0; }\r
+.jstree-default a ins.jstree-icon { _background-position:-56px -19px; }\r
+#vakata-contextmenu.jstree-default-context ins { _display:none; }\r
+#vakata-contextmenu.jstree-default-context li { _zoom:1; }\r
+.jstree-default .jstree-undetermined a .jstree-checkbox { _background-position:-20px -19px; }\r
+.jstree-default .jstree-checked a .jstree-checkbox { _background-position:-38px -19px; }\r
+.jstree-default .jstree-unchecked a .jstree-checkbox { _background-position:-2px -19px; }\r
+/* IE6 END */
\ No newline at end of file
diff --git a/www/js/themes/default/throbber.gif b/www/js/themes/default/throbber.gif
new file mode 100644 (file)
index 0000000..5b33f7e
Binary files /dev/null and b/www/js/themes/default/throbber.gif differ
index 5cb821e480d0a6fb716a4904178485045ab67996..e25021dc199a4a557407974f912b7f309bd3e706 100644 (file)
@@ -376,6 +376,7 @@ div#sidebar table td {
     padding-bottom: 0.25em;
     padding-right: 0.5em;
 }
+/*
 div#sidebar ul {
     list-style-type: none;
     margin: 0;
@@ -383,7 +384,7 @@ div#sidebar ul {
 }
 div#sidebar ul li {
     margin: 0.5em 0;
-}
+}*/
 
 div#related {
     padding: 0.5em;