FELIX-3903 - Restructuration of the JMX handler project and migration of the tests to pax exam 3

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1450821 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/handler/jmx/jmx-handler/DEPENDENCIES b/ipojo/handler/jmx/jmx-handler/DEPENDENCIES
new file mode 100644
index 0000000..951b489
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/DEPENDENCIES
@@ -0,0 +1,18 @@
+Apache Felix iPOJO JMX Handler
+Copyright 2008-2011 The Apache Software Foundation
+
+This software was developed at the Apache Software Foundation
+(http://www.apache.org) and may have dependencies on other
+Apache software licensed under Apache License 2.0.
+
+I. Included Third-Party Software
+
+II. Used Third-Party Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2009).
+Licensed under the Apache License 2.0.
+
+III. Overall License Summary
+- Apache License 2.0
diff --git a/ipojo/handler/jmx/jmx-handler/LICENSE b/ipojo/handler/jmx/jmx-handler/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/ipojo/handler/jmx/jmx-handler/NOTICE b/ipojo/handler/jmx/jmx-handler/NOTICE
new file mode 100644
index 0000000..ae6a19c
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/NOTICE
@@ -0,0 +1,7 @@
+Apache Felix iPOJO JMX Handler
+Copyright 2008-2011 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
diff --git a/ipojo/handler/jmx/jmx-handler/doc/changelog.txt b/ipojo/handler/jmx/jmx-handler/doc/changelog.txt
new file mode 100644
index 0000000..87556fc
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/changelog.txt
@@ -0,0 +1,23 @@
+Changes from 1.4.0 to 1.6.0
+---------------------------
+** Improvement
+    * [FELIX-2633] - Rename JMX annotations
+
+Changes from 1.2.0 to 1.4.0
+---------------------------
+** Bug
+    * [FELIX-1183] - iPOJO JMX handler doesn't re-throw exceptions
+
+** Improvement
+    * Update parent pom
+
+
+Changes from 1.0.0 to 1.2.0
+---------------------------
+** Bug
+   * [FELIX-828] - iPOJO JMX Handler: the name attribute has not the expected behavior
+    * [FELIX-829] - iPOJO JMX Handler: the sub-element should refer to the handler namespace
+
+Version 1.0.0
+-------------
+    * Initial release
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler.html b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler.html
new file mode 100644
index 0000000..b80c735
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler.html
@@ -0,0 +1,671 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head>
+
+
+  
+    <title>Apache Felix - iPOJO JMX Handler</title>
+    <link rel="stylesheet" href="ipojo-jmx-handler_files/site.css" type="text/css" media="all">
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+  </head><body>
+    <div class="title"><div class="logo"><a href="http://felix.apache.org/site/index.html"><img alt="Apache Felix" src="ipojo-jmx-handler_files/logo.png" border="0"></a></div><div class="header"><a href="http://www.apache.org/"><img alt="Apache" src="ipojo-jmx-handler_files/apache.png" border="0"></a></div></div>
+    <div class="menu">
+<ul>
+	<li><a href="http://felix.apache.org/site/news.html" title="news">news</a></li>
+	<li><a href="http://felix.apache.org/site/license.html" title="license">license</a></li>
+	<li><a href="http://felix.apache.org/site/downloads.cgi" rel="nofollow">downloads</a></li>
+	<li><a href="http://felix.apache.org/site/documentation.html" title="documentation">documentation</a></li>
+	<li><a href="http://felix.apache.org/site/mailinglists.html" title="mailinglists">mailing lists</a></li>
+	<li><a href="http://felix.apache.org/site/contributing.html" title="Contributing">contributing</a></li>
+	<li><a href="http://www.apache.org/" rel="nofollow">asf</a></li>
+	<li><a href="http://www.apache.org/foundation/sponsorship.html" rel="nofollow">sponsorship</a></li>
+	<li><a href="http://www.apache.org/foundation/thanks.html" rel="nofollow">sponsors</a>
+<!-- ApacheCon Ad -->
+<iframe src="ipojo-jmx-handler_files/button.html" style="border-width: 0pt; float: left;" scrolling="no" frameborder="0" height="135" width="135"></iframe>
+<p style="height: 100px;">
+<!-- ApacheCon Ad -->
+</p></li></ul> </div>
+    <div class="main">
+<style type="text/css">
+ @import url(http://people.apache.org/~clement/ipojo/site/superfish.css); 
+</style>
+
+<style type="text/css">
+ @import url(http://people.apache.org/~clement/ipojo/site/style.css); 
+</style>
+
+<p>
+<script class="javascript" src="ipojo-jmx-handler_files/shCore.js"></script>
+<script class="javascript" src="ipojo-jmx-handler_files/shBrushCSharp.js"></script>
+<script class="javascript" src="ipojo-jmx-handler_files/shBrushPhp.js"></script>
+<script class="javascript" src="ipojo-jmx-handler_files/shBrushJScript.js"></script>
+<script class="javascript" src="ipojo-jmx-handler_files/shBrushVb.js"></script>
+<script class="javascript" src="ipojo-jmx-handler_files/shBrushSql.js"></script>
+<script class="javascript" src="ipojo-jmx-handler_files/shBrushXml.js"></script>
+<script class="javascript" src="ipojo-jmx-handler_files/shBrushShell.js"></script>
+<script class="javascript" src="ipojo-jmx-handler_files/shBrushDelphi.js"></script>
+<script class="javascript" src="ipojo-jmx-handler_files/shBrushPython.js"></script>
+<script class="javascript" src="ipojo-jmx-handler_files/shBrushJava.js"></script>
+
+<script type="text/javascript" src="ipojo-jmx-handler_files/jquery-1.js"></script>
+<script type="text/javascript" src="ipojo-jmx-handler_files/hoverIntent.js"></script> 
+<script type="text/javascript" src="ipojo-jmx-handler_files/superfish.js"></script> 
+<script type="text/javascript" src="ipojo-jmx-handler_files/supersubs.js"></script> 
+
+<script type="text/javascript"> 
+ 
+    $(document).ready(function(){ 
+        $("ul.sf-menu").supersubs({ 
+            minWidth:    14,   // minimum width of sub-menus in em units 
+            maxWidth:    30,   // maximum width of sub-menus in em units 
+            extraWidth:  1     // extra width can ensure lines don't sometimes turn over 
+                               // due to slight rounding differences and font-family 
+        }).superfish();  // call supersubs first, then superfish, so that subs are 
+                         // not display:none when measuring. Call before initialising 
+                         // containing tabs for same reason. 
+    }); 
+ 
+</script>
+</p><div class="main">
+<div class="page-header">
+<img src="ipojo-jmx-handler_files/header.png" class="header">
+<a href="http://ipojo.org/"><img src="ipojo-jmx-handler_files/ipojo.png" class="header-logo" width="225"></a>
+<ul class="sf-menu sf-js-enabled sf-shadow" id="ipojo-menu">
+<li class="current">
+<!-- Menu Overview -->
+<a href="" class="sf-with-ul">Overview<span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span></a>
+<ul style="float: none; width: 14em; display: none; visibility: hidden;">
+	<li style="white-space: normal; float: left; width: 100%;">
+	<a style="float: none; width: auto;" href="http://felix.apache.org/site/apache-felix-ipojo.html" title="Apache Felix iPOJO">Home</a>							
+	</li>
+	<li style="white-space: normal; float: left; width: 100%;">
+	<a style="float: none; width: auto;" href="http://felix.apache.org/site/apache-felix-ipojo-why-choose-ipojo.html" title="apache-felix-ipojo-why-choose-ipojo">Why choose iPOJO</a>
+	</li>
+	<li style="white-space: normal; float: left; width: 100%;">
+	<a style="float: none; width: auto;" href="http://felix.apache.org/site/apache-felix-ipojo-successstories.html" title="apache-felix-ipojo-successstories">Success stories</a>
+	</li>
+	<li style="white-space: normal; float: left; width: 100%;">
+	<a style="float: none; width: auto;" href="http://felix.apache.org/site/apache-felix-ipojo-feature-overview.html" title="Apache Felix iPOJO Feature Overview">Features</a>
+	</li>
+</ul>
+</li>	
+
+<li class="">			
+<!-- Menu download -->
+</li><li>
+<a href="http://felix.apache.org/site/download.html" title="Download">Download </a>
+</li>
+
+<li class="">					
+<!-- Menu Documentation -->
+<a href="" class="sf-with-ul">Documentation<span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span></a>
+<ul style="float: none; width: 14em; display: none; visibility: hidden;">
+    <!-- sub- menu : getting started -->
+    <li style="white-space: normal; float: left; width: 100%;" class="">
+    <a style="float: none; width: auto;" href="" class="sf-with-ul">Getting Started<span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span></a>
+    <ul style="left: 14em; float: none; width: 14em; display: none; visibility: hidden;">
+     <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/ipojo-in-10-minutes.html" title="iPOJO in 10 minutes">iPOJO in 10 minutes</a></li>
+     <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/how-to-use-ipojo-annotations.html" title="How to use iPOJO Annotations">Using Annotations</a></li>
+     <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/ipojo-hello-word-maven-based-tutorial.html" title="iPOJO Hello Word (Maven-Based) tutorial">Maven tutorial</a></li>
+     <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/ipojo-advanced-tutorial.html" title="iPOJO Advanced Tutorial">Advanced tutorial</a></li>
+     <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/apache-felix-ipojo-dosgi.html" title="apache-felix-ipojo-dosgi">Using Distributed OSGi</a></li>
+     <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/ipojo-composition-tutorial.html" title="iPOJO Composition Tutorial">Application Composition</a></li>
+    </ul>
+    </li> <!-- end of getting started -->
+    <!-- sub menu : Describing Components -->
+     <li style="white-space: normal; float: left; width: 100%;" class="">
+        <a style="float: none; width: auto;" href="http://felix.apache.org/site/describing-components.html" class="sf-with-ul">Describing components<span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span></a>
+        <ul style="left: 14em; float: none; width: 14em; display: none; visibility: hidden;">
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/service-requirement-handler.html" title="Service Requirement Handler">Requiring a service</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/providing-osgi-services.html" title="Providing OSGi services">Providing a service</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/lifecycle-callback-handler.html" title="Lifecycle Callback Handler">Lifecycle management</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/configuration-handler.html" title="Configuration Handler">Configuration</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/architecture-handler.html" title="Architecture Handler">Introspection</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/controller-lifecycle-handler.html" title="Controller Lifecycle Handler">Impacting the lifecycle</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/event-admin-handlers.html" title="Event Admin Handlers">Asynchronous communication</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="" title="iPOJO JMX Handler">JMX management</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/extender-pattern-handler.html" title="Extender Pattern Handler">Extender pattern</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/white-board-pattern-handler.html" title="White Board Pattern Handler">Whiteboard pattern</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/temporal-service-dependency.html" title="Temporal Service Dependency">Temporal dependencies</a></li>
+        </ul>
+     </li> <!-- End of describing components -->
+    <!-- sub- menu : User Guide -->
+    <li style="white-space: normal; float: left; width: 100%;" class="">
+    <a style="float: none; width: auto;" href="" class="sf-with-ul">User Guide<span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span></a>
+        <ul style="left: 14em; float: none; width: 14em; display: none; visibility: hidden;">
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/using-xml-schemas.html" title="Using XML Schemas">XML Schemas</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/apache-felix-ipojo-api.html" title="apache-felix-ipojo-api">API</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/apache-felix-ipojo-testing-components.html" title="apache-felix-ipojo-testing-components">Testing components</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/apache-felix-ipojo-eclipse-integration.html" title="apache-felix-ipojo-eclipse-integration">Eclipse Integration</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/ipojo-faq.html" title="iPOJO FAQ">FAQ</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/ipojo-reference-card.html" title="iPOJO-Reference-Card">Reference Card</a></li>
+        </ul>
+    </li> <!-- end of user guide -->
+    <!-- sub- menu : Dev Guide -->
+    <li class="" style="white-space: normal; float: left; width: 100%;"> 
+    <a style="float: none; width: auto;" href="" class="sf-with-ul">Advanced Topics<span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span></a>
+       <ul style="left: 14em; float: none; width: 14em; display: none; visibility: hidden;">
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/ipojo/api/1.2.0" rel="nofollow">Javadoc</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/how-to-write-your-own-handler.html" title="How to write your own handler">Handler guide</a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/how-to-use-ipojo-manipulation-metadata.html" title="How to use iPOJO Manipulation Metadata">Manipulation Metadata </a></li>
+        <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/dive-into-the-ipojo-manipulation-depths.html" title="Dive into the iPOJO Manipulation depths">Dive into the iPOJO Manipulation depths</a></li>
+       </ul>
+    </li> <!-- End of Dev guide -->
+</ul> 
+</li> <!-- End of doc -->
+<!-- Menu 4 : Tools -->
+<li class="">
+<a href="" class="sf-with-ul">Tools<span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span></a>
+<ul style="float: none; width: 14em; display: none; visibility: hidden;">
+   <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/ipojo-ant-task.html" title="iPOJO Ant Task">Ant Task</a></li>
+   <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/ipojo-eclipse-plug-in.html" title="iPOJO Eclipse Plug-in">Eclipse Plugin</a></li>
+   <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/ipojo-maven-plug-in.html" title="iPOJO Maven Plug-in">Maven Plugin</a></li>
+   <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/apache-felix-ipojo-online-manipulator.html" title="apache-felix-ipojo-online-manipulator">Online Manipulator</a></li>
+   <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/ipojo-webconsole-plugin.html" title="iPOJO Webconsole Plugin">Webconsole plugin</a></li>
+   <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/apache-felix-ipojo-junit4osgi.html" title="apache-felix-ipojo-junit4osgi">Junit4OSGi</a></li>
+</ul>   
+</li><!-- End of tools -->					
+<!-- Menu 5 : Misc -->
+<li class="">
+<a href="" class="sf-with-ul">Misc<span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span><span class="sf-sub-indicator"> »</span></a>
+<ul style="float: none; width: 14em; display: none; visibility: hidden;">
+   <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/apache-felix-ipojo-issuestracker.html" title="apache-felix-ipojo-issuestracker">Issues Tracker</a></li>
+   <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/apache-felix-ipojo-supportedvms.html" title="apache-felix-ipojo-supportedVMs">Supported JVMs</a></li>
+   <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/apache-felix-ipojo-supportedosgi.html" title="apache-felix-ipojo-supportedOSGi">Supported OSGi Implementations</a></li>
+   <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://ipojo-dark-side.blogspot.com/" rel="nofollow">iPOJO's Dark Side Blog</a></li>
+   <li style="white-space: normal; float: left; width: 100%;"><a style="float: none; width: auto;" href="http://felix.apache.org/site/article-presentations.html" title="Article &amp; Presentations">Article &amp; Presentations</a></li>
+</ul>
+</li><!-- End of misc -->
+</ul> <!-- End of the menu -->
+</div> <!-- Page header -->
+
+
+<div class="content">
+
+<h1><a name="iPOJOJMXHandler-iPOJOJMXHandler"></a>iPOJO JMX Handler</h1>
+
+<p><em>This handler provides JMX management of component instance. It
+could be useful to manage instance remotely. As the handler exposes
+MBeans, you must have a MBean server running on your platform (as the
+platform MBean server or the MOSGi MBean Server).</em></p>
+
+<div class="toc">
+<ul>
+    <li><a href="#iPOJOJMXHandler-Features">Features</a></li>
+    <li><a href="#iPOJOJMXHandler-Prerequisites">Prerequisites</a></li>
+    <li><a href="#iPOJOJMXHandler-Download">Download</a></li>
+    <li><a href="#iPOJOJMXHandler-Howtouseit">How to use it</a></li>
+    <li><a href="#iPOJOJMXHandler-JMXHandleroptions">JMX Handler options</a></li>
+    <li><a href="#iPOJOJMXHandler-Globalhandlerattributes">Global handler attributes</a></li>
+    <li><a href="#iPOJOJMXHandler-Propertiesattributes">Properties attributes</a></li>
+    <li><a href="#iPOJOJMXHandler-Methodsattributes">Methods attributes</a></li>
+    <li><a href="#iPOJOJMXHandler-Examples">Examples</a></li>
+<ul>
+    <li><a href="#iPOJOJMXHandler-ExposingAttributes">Exposing Attributes</a></li>
+    <li><a href="#iPOJOJMXHandler-ExposingMethods">Exposing Methods</a></li>
+    <li><a href="#iPOJOJMXHandler-AttributeNotifications%253A">Attribute Notifications:</a></li>
+</ul>
+    <li><a href="#iPOJOJMXHandler-Configuringthehandlerwithannotations">Configuring the handler with annotations</a></li>
+</ul></div>
+
+<h2><a name="iPOJOJMXHandler-Features"></a>Features</h2>
+
+<p>The handler allows to:</p>
+<ul>
+	<li>Expose attributes accessible via JMX (with rights management).</li>
+	<li>Expose methods to be called through JMX.</li>
+	<li>Get notifications when attributes are modified .</li>
+</ul>
+
+
+<h2><a name="iPOJOJMXHandler-Prerequisites"></a>Prerequisites</h2>
+
+<p>To be functional this handler must register on an MBean Server,thus
+you obviously need it. Several servers are currently supported : the
+standard platform MBean server (included in the JDK), MOSGi (provided
+with Felix), ...<br>
+To use MOSGi, you have to deploy at least the following three bundles of MOSGi:</p>
+<ul>
+	<li>org.apache.felix.mosgi.jmx.agent</li>
+	<li>org.apache.felix.mosgi.jmx.registry</li>
+	<li>org.apache.felix.mosgi.jmx.rmiconnector</li>
+</ul>
+
+
+<p>You can find MOSGi documentation on <a href="http://cwiki.apache.org/FELIX/mosgi-managed-osgi-framework.html" rel="nofollow">http://cwiki.apache.org/FELIX/mosgi-managed-osgi-framework.html</a></p>
+
+<h2><a name="iPOJOJMXHandler-Download"></a>Download</h2>
+
+<p>The JMX handler is available in the Felix trunk in the iPOJO project. See the <a href="http://felix.apache.org/site/download.html" title="Download">Download</a> page to download and compile these sources.</p>
+
+<h2><a name="iPOJOJMXHandler-Howtouseit"></a>How to use it</h2>
+
+<p>The handler needs to be added in the metadata.xml, you just add a namespace (e.g., jmx) :</p>
+<div class="code">
+<div class="dp-highlighter"><table class="dp-xml" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="line1"><span></span><span class="tag">&lt;</span><span>ipojo&nbsp;xmlns:</span><span class="attribute">jmx</span><span>=</span><span class="attribute-value">"org.apache.felix.ipojo.handlers.jmx"</span><span>&gt;&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;</td></tr><tr><td class="line1"><span class="tag">&lt;/</span><span>ipojo</span><span class="tag">&gt;</span><span>&nbsp;</span></td></tr></tbody></table></div><textarea style="display: none;" name="newcodemacro" class="xml:nocontrols:nogutter" rows="10" readonly="readonly">&lt;ipojo xmlns:jmx="org.apache.felix.ipojo.handlers.jmx"&gt;
+	...
+&lt;/ipojo&gt;</textarea>
+<script class="javascript">
+    if(!window.newcodemacro_initialised)
+    {
+        window.newcodemacro_initialised = true;
+        window.oldonloadmethod = window.onload;
+        window.onload = function(){
+            dp.SyntaxHighlighter.HighlightAll('newcodemacro');
+            if(window.oldonloadmethod)
+            {
+                window.oldonloadmethod();
+            }
+        }
+    }
+
+</script>
+</div>
+
+<p>So, you could now expose in JMX properties and methods of your component. They are surrounded by the &lt;jmx:config&gt;<br>
+tag.</p>
+<div class="code">
+<div class="dp-highlighter"><table class="dp-xml" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="line1"><span></span><span class="tag">&lt;</span><span>jmx:config</span><span class="tag">&gt;</span><span>&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span>jmx:property&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"message"</span><span>&nbsp;</span><span class="attribute">field</span><span>=</span><span class="attribute-value">"m_msg"</span><span>&nbsp;</span><span class="attribute">rights</span><span>=</span><span class="attribute-value">"w"</span><span>&nbsp;</span><span class="attribute">notification</span><span>=</span><span class="attribute-value">"true"</span><span>/&gt;&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span>jmx:method&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"doSomethingBad"</span><span>/&gt;&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span>jmx:method&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"doSomethingGood"</span><span>/&gt;&nbsp;</span></td></tr><tr><td class="line1"><span class="tag">&lt;/</span><span>jmx:config</span><span class="tag">&gt;</span><span>&nbsp;</span></td></tr></tbody></table></div><textarea style="display: none;" name="newcodemacro" class="xml:nocontrols:nogutter" rows="10" readonly="readonly">&lt;jmx:config&gt;
+    &lt;jmx:property name="message" field="m_msg" rights="w" notification="true"/&gt;
+    &lt;jmx:method name="doSomethingBad"/&gt;
+    &lt;jmx:method name="doSomethingGood"/&gt;
+&lt;/jmx:config&gt;</textarea>
+<script class="javascript">
+    if(!window.newcodemacro_initialised)
+    {
+        window.newcodemacro_initialised = true;
+        window.oldonloadmethod = window.onload;
+        window.onload = function(){
+            dp.SyntaxHighlighter.HighlightAll('newcodemacro');
+            if(window.oldonloadmethod)
+            {
+                window.oldonloadmethod();
+            }
+        }
+    }
+
+</script>
+</div>
+
+<div class="panelMacro"><table class="infoMacro"><colgroup><col width="24"><col></colgroup><tbody><tr><td valign="top"><img src="ipojo-jmx-handler_files/information.gif" alt="" border="0" align="absmiddle" height="16" width="16"></td><td><b>Serialization</b><br><p>Be
+careful that the argument and return type of methods must be
+serializable. In case of several methods have the same name, each of
+them will be exposed.</p></td></tr></tbody></table></div>
+
+<h2><a name="iPOJOJMXHandler-JMXHandleroptions"></a>JMX Handler options</h2>
+
+<p>Here you can find all configuration options of the JMX handler.
+There are two kinds of manageable elements : properties and methods.
+First is described the global configuration of the handler. Then
+elements can be configured, using several attributes, as described
+below.</p>
+
+<h2><a name="iPOJOJMXHandler-Globalhandlerattributes"></a>Global handler attributes</h2>
+<div class="borderedTable"><table class="confluenceTable"><tbody>
+<tr>
+<th class="confluenceTh">Attribute name </th>
+<th class="confluenceTh"> Required </th>
+<th class="confluenceTh"> Description</th>
+</tr>
+<tr>
+<td class="confluenceTd">objectName</td>
+<td class="confluenceTd">NO</td>
+<td class="confluenceTd">The complete object name of the managed
+component. The syntax of this attribute must be compliant with the
+ObjectName syntax, detailed in the JMX specification.<br>
+If neither domain nor name attributes are specified, the default value
+is determined by the package, the type and the instance name of the
+component. This attribute overrides the domain and name attributes.<br>
+<em>Example:</em> "my.domain:type=myType,name=myName"</td>
+</tr>
+<tr>
+<td class="confluenceTd">domain</td>
+<td class="confluenceTd">NO</td>
+<td class="confluenceTd">The domain of the managed object (i.e., the
+left part of the object name). This attribute must be compliant with
+the domain syntax, as described in the JMX specification.<br>
+<em>Example:</em> "my.domain"</td>
+</tr>
+<tr>
+<td class="confluenceTd">name</td>
+<td class="confluenceTd">NO</td>
+<td class="confluenceTd">The name property of the managed object. The
+value of this attribute must comply with the ObjectName value syntax,
+as described in the JMX specification.</td>
+</tr>
+<tr>
+<td class="confluenceTd">usesMOSGi</td>
+<td class="confluenceTd">NO</td>
+<td class="confluenceTd">Determines if the component must be register on the MOSGi MBean server or not.</td>
+</tr>
+<tr>
+<td class="confluenceTd">preRegister <br>
+postRegister <br>
+preDeregister<br>
+postDeregister</td>
+<td class="confluenceTd">NO</td>
+<td class="confluenceTd">These attributes allow to specify methods to
+carry out operations before and after being registered or unregistered
+from the MBean server.</td>
+</tr>
+</tbody></table></div>
+
+<h2><a name="iPOJOJMXHandler-Propertiesattributes"></a>Properties attributes</h2>
+<div class="borderedTable"><table class="confluenceTable"><tbody>
+<tr>
+<th class="confluenceTh">Attribute name</th>
+<th class="confluenceTh">Required</th>
+<th class="confluenceTh">Description</th>
+</tr>
+<tr>
+<td class="confluenceTd">field</td>
+<td class="confluenceTd">YES</td>
+<td class="confluenceTd">The name of the component's field to expose.</td>
+</tr>
+<tr>
+<td class="confluenceTd">name</td>
+<td class="confluenceTd">NO</td>
+<td class="confluenceTd">The name of the property as it will appear in JMX. If unspecified, the default value is the name of the exposed field.</td>
+</tr>
+<tr>
+<td class="confluenceTd">rights</td>
+<td class="confluenceTd">NO</td>
+<td class="confluenceTd">Specify the access permission of the exposed field. The accepted values are : 
+<ul>
+	<li>"r" : read-only access, the default value.</li>
+	<li>"w" : read and write access.</li>
+</ul>
+</td>
+</tr>
+<tr>
+<td class="confluenceTd">notification</td>
+<td class="confluenceTd">NO</td>
+<td class="confluenceTd">Enable or disable attribute change
+notification sending for this property. If set to "true", a
+notification is sent each time the value of the field changes.</td>
+</tr>
+</tbody></table></div>
+<h2><a name="iPOJOJMXHandler-Methodsattributes"></a>Methods attributes</h2>
+<div class="borderedTable"><table class="confluenceTable"><tbody>
+<tr>
+<th class="confluenceTh">Attribute name</th>
+<th class="confluenceTh">Required</th>
+<th class="confluenceTh">Description</th>
+</tr>
+<tr>
+<td class="confluenceTd">name</td>
+<td class="confluenceTd">YES</td>
+<td class="confluenceTd">The name of the method to expose. If multiple methods have the same name, all of them are exposed.</td>
+</tr>
+<tr>
+<td class="confluenceTd">description</td>
+<td class="confluenceTd">NO</td>
+<td class="confluenceTd">The description of the exposed method, as it will appear in JMX.</td>
+</tr>
+</tbody></table></div>
+
+<h2><a name="iPOJOJMXHandler-Examples"></a>Examples</h2>
+
+<p>In this part, we will give you a complete example of a component managed with JMX, using the JConsole provided by the SUN JDK.</p>
+
+<h3><a name="iPOJOJMXHandler-ExposingAttributes"></a>Exposing Attributes</h3>
+
+<p>In first time we create a simple component named MyComponent. We have add two fields named m_level (int) and m_message (String).</p>
+<div class="code">
+<div class="dp-highlighter"><table class="dp-c" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="line1"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;</span></td></tr><tr><td class="line2">MyComponent&nbsp;...&nbsp;{&nbsp;</td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;Exposed&nbsp;attributes</span><span>&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;String&nbsp;m_message;&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;int&nbsp;m_level;&nbsp;</span></td></tr><tr><td class="line2">}&nbsp;</td></tr></tbody></table></div><textarea style="display: none;" name="newcodemacro" class="java:nocontrols:nogutter" rows="10" readonly="readonly">public class
+MyComponent ... {
+	// Exposed attributes
+	private String m_message;
+	private int m_level;
+}</textarea>
+<script class="javascript">
+    if(!window.newcodemacro_initialised)
+    {
+        window.newcodemacro_initialised = true;
+        window.oldonloadmethod = window.onload;
+        window.onload = function(){
+            dp.SyntaxHighlighter.HighlightAll('newcodemacro');
+            if(window.oldonloadmethod)
+            {
+                window.oldonloadmethod();
+            }
+        }
+    }
+
+</script>
+</div>
+
+<p>We expose now the attributes in the jmx:config<br>
+tag in the metadata :</p>
+<div class="code">
+<div class="dp-highlighter"><table class="dp-xml" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="line1"><span></span><span class="tag">&lt;?</span><span>xml&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span>?&gt;&nbsp;</span></td></tr><tr><td class="line2"><span class="tag">&lt;</span><span>iPOJO&nbsp;xmlns:</span><span class="attribute">jmx</span><span>=</span><span class="attribute-value">"org.apache.felix.ipojo.handlers.jmx"</span><span>&gt;&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span>component&nbsp;</span><span class="attribute">className</span><span>=</span><span class="attribute-value">"...MyComponent"</span><span>&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">architecture</span><span>=</span><span class="attribute-value">"true"</span><span>&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">immediate</span><span>=</span><span class="attribute-value">"true"</span><span>&gt;&nbsp;</span></td></tr><tr><td class="line2">&nbsp;</td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span>provides</span><span class="tag">/&gt;</span><span>&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span>jmx:config</span><span class="tag">&gt;</span><span>&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;<span class="comments">&lt;!--&nbsp;Exposed&nbsp;properties&nbsp;--&gt;</span><span>&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span>jmx:property&nbsp;</span><span class="attribute">field</span><span>=</span><span class="attribute-value">"m_level"</span><span>&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">name</span><span>=</span><span class="attribute-value">"The&nbsp;level"</span><span>&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">rights</span><span>=</span><span class="attribute-value">"r"</span><span>/&gt;&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span>jmx:property&nbsp;</span><span class="attribute">field</span><span>=</span><span class="attribute-value">"m_message"</span><span>&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">name</span><span>=</span><span class="attribute-value">"The&nbsp;message"</span><span>&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">rights</span><span>=</span><span class="attribute-value">"w"</span><span>/&gt;&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span>jmx:config</span><span class="tag">&gt;</span><span>&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span>component</span><span class="tag">&gt;</span><span>&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span>instance&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">component</span><span>=</span><span class="attribute-value">"...MyComponent"</span><span>/&gt;&nbsp;</span></td></tr><tr><td class="line2"><span class="tag">&lt;/</span><span>iPOJO</span><span class="tag">&gt;</span><span>&nbsp;</span></td></tr></tbody></table></div><textarea style="display: none;" name="newcodemacro" class="xml:nocontrols:nogutter" rows="10" readonly="readonly">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;iPOJO xmlns:jmx="org.apache.felix.ipojo.handlers.jmx"&gt;
+    &lt;component className="...MyComponent"
+      architecture="true"
+      immediate="true"&gt;
+
+      &lt;provides/&gt;
+      &lt;jmx:config&gt;
+	&lt;!-- Exposed properties --&gt;
+	&lt;jmx:property field="m_level"
+          name="The level"
+          rights="r"/&gt;
+	&lt;jmx:property field="m_message"
+          name="The message"
+          rights="w"/&gt;
+      &lt;/jmx:config&gt;
+    &lt;/component&gt;
+    &lt;instance
+      component="...MyComponent"/&gt;
+&lt;/iPOJO&gt;</textarea>
+<script class="javascript">
+    if(!window.newcodemacro_initialised)
+    {
+        window.newcodemacro_initialised = true;
+        window.oldonloadmethod = window.onload;
+        window.onload = function(){
+            dp.SyntaxHighlighter.HighlightAll('newcodemacro');
+            if(window.oldonloadmethod)
+            {
+                window.oldonloadmethod();
+            }
+        }
+    }
+
+</script>
+</div>
+
+<p>Now, we could get and write the properties in the JConsole :<br>
+<img src="ipojo-jmx-handler_files/JMXHandler_1.png" border="0" align="absmiddle"></p>
+
+<h3><a name="iPOJOJMXHandler-ExposingMethods"></a>Exposing Methods</h3>
+
+<p>We could now add methods in the initial class :</p>
+<div class="code">
+<div class="dp-highlighter"><table class="dp-c" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="line1"><span></span><span class="comment">/**</span></td></tr><tr><td class="line2"><span class="comment">Do&nbsp;something&nbsp;good</span></td></tr><tr><td class="line1"><span class="comment">*/</span><span>&nbsp;</span></td></tr><tr><td class="line2"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doSomethingGood()&nbsp;{&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;</td></tr><tr><td class="line2">}&nbsp;</td></tr><tr><td class="line1">&nbsp;</td></tr><tr><td class="line2"><span class="comment">/**</span></td></tr><tr><td class="line1"><span class="comment">Do&nbsp;something&nbsp;bad</span></td></tr><tr><td class="line2"><span class="comment">*/</span><span>&nbsp;</span></td></tr><tr><td class="line1"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doSomethingBad()&nbsp;{&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;</td></tr><tr><td class="line1">}&nbsp;</td></tr><tr><td class="line2">&nbsp;</td></tr><tr><td class="line1"><span class="comment">/**</span></td></tr><tr><td class="line2"><span class="comment">Do&nbsp;nothing</span></td></tr><tr><td class="line1"><span class="comment">*/</span><span>&nbsp;</span></td></tr><tr><td class="line2"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doNothing()&nbsp;{&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;</td></tr><tr><td class="line2">}&nbsp;</td></tr></tbody></table></div><textarea style="display: none;" name="newcodemacro" class="java:nocontrols:nogutter" rows="10" readonly="readonly">/**
+Do something good
+*/
+public void doSomethingGood() {
+		...
+}
+
+/**
+Do something bad
+*/
+public void doSomethingBad() {
+		...
+}
+
+/**
+Do nothing
+*/
+public void doNothing() {
+		...
+}</textarea>
+<script class="javascript">
+    if(!window.newcodemacro_initialised)
+    {
+        window.newcodemacro_initialised = true;
+        window.oldonloadmethod = window.onload;
+        window.onload = function(){
+            dp.SyntaxHighlighter.HighlightAll('newcodemacro');
+            if(window.oldonloadmethod)
+            {
+                window.oldonloadmethod();
+            }
+        }
+    }
+
+</script>
+</div>
+
+<p>We add corresponding tags in the metadata to expose these methods:</p>
+<div class="code">
+<div class="dp-highlighter"><table class="dp-xml" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="line1"><span></span><span class="comments">&lt;!--&nbsp;Exposed&nbsp;methods&nbsp;--&gt;</span><span>&nbsp;</span></td></tr><tr><td class="line2"><span class="tag">&lt;</span><span>jmx:method&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"doSomethingGood"</span><span>&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">description</span><span>=</span><span class="attribute-value">"Do&nbsp;something&nbsp;good."</span><span>/&gt;&nbsp;</span></td></tr><tr><td class="line2"><span class="tag">&lt;</span><span>jmx:method&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"doSomethingBad"</span><span>&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">description</span><span>=</span><span class="attribute-value">"Do&nbsp;something&nbsp;bad."</span><span>/&gt;&nbsp;</span></td></tr><tr><td class="line2"><span class="tag">&lt;</span><span>jmx:method&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"doNothing"</span><span>&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">description</span><span>=</span><span class="attribute-value">"Do&nbsp;absolutely&nbsp;nothing."</span><span>/&gt;&nbsp;</span></td></tr></tbody></table></div><textarea style="display: none;" name="newcodemacro" class="xml:nocontrols:nogutter" rows="10" readonly="readonly">&lt;!-- Exposed methods --&gt;
+&lt;jmx:method name="doSomethingGood"
+      description="Do something good."/&gt;
+&lt;jmx:method name="doSomethingBad"
+      description="Do something bad."/&gt;
+&lt;jmx:method name="doNothing"
+      description="Do absolutely nothing."/&gt;</textarea>
+<script class="javascript">
+    if(!window.newcodemacro_initialised)
+    {
+        window.newcodemacro_initialised = true;
+        window.oldonloadmethod = window.onload;
+        window.onload = function(){
+            dp.SyntaxHighlighter.HighlightAll('newcodemacro');
+            if(window.oldonloadmethod)
+            {
+                window.oldonloadmethod();
+            }
+        }
+    }
+
+</script>
+</div>
+
+<p>Now the three methods are exposed in the operations tab of the JConsole. We can invoked these methods :</p>
+
+<p><img src="ipojo-jmx-handler_files/JMXHandler_2.png" border="0" align="absmiddle"></p>
+
+<h3><a name="iPOJOJMXHandler-AttributeNotifications:"></a>Attribute Notifications:</h3>
+
+<p>You could subscribe to attribute notification by adding the
+notification attribute in property tag. In our example if we want to be
+notified when m_level is modified, we change the property line in the
+metatada like this:</p>
+<div class="code">
+<div class="dp-highlighter"><table class="dp-xml" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="line1"><span></span><span class="tag">&lt;</span><span>jmx:property&nbsp;</span><span class="attribute">field</span><span>=</span><span class="attribute-value">"m_level"</span><span>&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">name</span><span>=</span><span class="attribute-value">"The&nbsp;level"</span><span>&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">rights</span><span>=</span><span class="attribute-value">"r"</span><span>&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">notification</span><span>=</span><span class="attribute-value">"true"</span><span>/&gt;&nbsp;</span></td></tr></tbody></table></div><textarea style="display: none;" name="newcodemacro" class="xml:nocontrols:nogutter" rows="10" readonly="readonly">&lt;jmx:property field="m_level"
+      name="The level"
+      rights="r"
+      notification="true"/&gt;</textarea>
+<script class="javascript">
+    if(!window.newcodemacro_initialised)
+    {
+        window.newcodemacro_initialised = true;
+        window.oldonloadmethod = window.onload;
+        window.onload = function(){
+            dp.SyntaxHighlighter.HighlightAll('newcodemacro');
+            if(window.oldonloadmethod)
+            {
+                window.oldonloadmethod();
+            }
+        }
+    }
+
+</script>
+</div>
+
+<p>So now if we change the string through JConsole or if the POJO is
+modified in other way, a notification will be sent to every listener.
+For example, we subscribe in the notification tab, and we get
+notification when the message changes :</p>
+
+<p><img src="ipojo-jmx-handler_files/JMXHandler_3.png" border="0" align="absmiddle"></p>
+
+<h2><a name="iPOJOJMXHandler-Configuringthehandlerwithannotations"></a>Configuring the handler with annotations</h2>
+
+<p>It is possible to configure the handler with simple annotations available with iPOJO annotations. Here is an example of usage:</p>
+<div class="code">
+<div class="dp-highlighter"><table class="dp-c" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="line1"><span></span><span class="keyword">import</span><span>&nbsp;org.apache.felix.ipojo.annotations.Component;&nbsp;</span></td></tr><tr><td class="line2"><span class="keyword">import</span><span>&nbsp;org.apache.felix.ipojo.handlers.jmx.Config;&nbsp;</span></td></tr><tr><td class="line1"><span class="keyword">import</span><span>&nbsp;org.apache.felix.ipojo.handlers.jmx.Method;&nbsp;</span></td></tr><tr><td class="line2"><span class="keyword">import</span><span>&nbsp;org.apache.felix.ipojo.handlers.jmx.Property;&nbsp;</span></td></tr><tr><td class="line1"><span class="preprocessor"></span></td></tr><tr><td class="line2"><span class="preprocessor">@Component</span><span>&nbsp;</span></td></tr><tr><td class="line1"><span class="preprocessor">@Config(domain="my-domain",&nbsp;usesMOSGi=false)</span><span>&nbsp;</span></td></tr><tr><td class="line2"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;JMXSimple&nbsp;{&nbsp;</span></td></tr><tr><td class="line1"><span class="preprocessor"></span></td></tr><tr><td class="line2"><span class="preprocessor">&nbsp;&nbsp;&nbsp;&nbsp;@Property(name="prop",&nbsp;notification=true,&nbsp;rights="w")&nbsp;//&nbsp;Field&nbsp;published&nbsp;in&nbsp;the&nbsp;MBean</span><span>&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;m_foo;&nbsp;</td></tr><tr><td class="line2"><span class="preprocessor">&nbsp;&nbsp;&nbsp;&nbsp;</span></td></tr><tr><td class="line1"><span class="preprocessor">&nbsp;&nbsp;&nbsp;&nbsp;@Method(description="set&nbsp;the&nbsp;foo&nbsp;prop")&nbsp;//&nbsp;Method&nbsp;published&nbsp;in&nbsp;the&nbsp;MBean</span><span>&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setFoo(String&nbsp;mes)&nbsp;{&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"Set&nbsp;foo&nbsp;to&nbsp;"</span><span>&nbsp;+&nbsp;mes);&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_foo&nbsp;=&nbsp;mes;&nbsp;</td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</td></tr><tr><td class="line2"><span class="preprocessor">&nbsp;&nbsp;&nbsp;&nbsp;</span></td></tr><tr><td class="line1"><span class="preprocessor">&nbsp;&nbsp;&nbsp;&nbsp;@Method(description="get&nbsp;the&nbsp;foo&nbsp;prop")&nbsp;//&nbsp;Method&nbsp;published&nbsp;in&nbsp;the&nbsp;MBean</span><span>&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;getFoo()&nbsp;{&nbsp;</span></td></tr><tr><td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;m_foo;&nbsp;</span></td></tr><tr><td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</td></tr><tr><td class="line1">}&nbsp;</td></tr></tbody></table></div><textarea style="display: none;" name="newcodemacro" class="java:nocontrols:nogutter" rows="10" readonly="readonly">import org.apache.felix.ipojo.annotations.Component;
+import org.apache.felix.ipojo.handlers.jmx.Config;
+import org.apache.felix.ipojo.handlers.jmx.Method;
+import org.apache.felix.ipojo.handlers.jmx.Property;
+
+@Component
+@Config(domain="my-domain", usesMOSGi=false)
+public class JMXSimple {
+
+    @Property(name="prop", notification=true, rights="w") // Field published in the MBean
+    String m_foo;
+    
+    @Method(description="set the foo prop") // Method published in the MBean
+    public void setFoo(String mes) {
+        System.out.println("Set foo to " + mes);
+        m_foo = mes;
+    }
+    
+    @Method(description="get the foo prop") // Method published in the MBean
+    public String getFoo() {
+        return m_foo;
+    }
+}</textarea>
+<script class="javascript">
+    if(!window.newcodemacro_initialised)
+    {
+        window.newcodemacro_initialised = true;
+        window.oldonloadmethod = window.onload;
+        window.onload = function(){
+            dp.SyntaxHighlighter.HighlightAll('newcodemacro');
+            if(window.oldonloadmethod)
+            {
+                window.oldonloadmethod();
+            }
+        }
+    }
+
+</script>
+</div>
+
+<p>The <tt>@org.apache.felix.ipojo.handlers.jmx.Config</tt> (<tt>@Config</tt> if the package it correctly imported) annotation is a type annotation (so placed on the <tt>class</tt> element. This annotation indicates that the instance will be exposed as an MBean. This annotation supports:</p>
+<ul>
+	<li>usesMOSGi: set to <tt>true</tt> to use MOSGi. Otherwise, the MBean will be exposed in the MBean Platform Server (default: <tt>false</tt>).</li>
+	<li>objectname: set the MBean objectname. The objectname must follow JMX specification. (default: <tt>package-name:factory-name:instance-name</tt>)</li>
+	<li>domain: set the MBean domain. (default: <tt>package-name</tt>)</li>
+	<li>name: set the MBean name. (default: <tt>instance-name</tt>).</li>
+</ul>
+
+
+<p>The <tt>@org.apache.felix.ipojo.handlers.jmx.Property</tt> (<tt>@Property</tt>) annotation is a field annotation indicating that the field is exposed in the MBean. The supported attributes are:</p>
+<ul>
+	<li>name: set the property name</li>
+	<li>rights: set the access permission. Possible values are <tt>r</tt> (read only) and <tt>w</tt> (read and write). By default, properties are in read-only mode.</li>
+	<li>notification: enables notification on this property. By default notifications are disabled.</li>
+</ul>
+
+
+<p>The <tt>@org.apache.felix.ipojo.handlers.jmx.Method</tt> (<tt>@Method</tt>) annotation is a method annotation indicating that the method is exposed in the MBean. Only one attribute can be customized:</p>
+<ul>
+	<li>description: set the method description.
+<br clear="all">
+<br clear="all">
+
+ </li></ul></div>
+        <img src="ipojo-jmx-handler_files/footer.png" class="footer">
+</div>
+
+<script type="text/javascript">
+var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
+document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
+</script><script src="ipojo-jmx-handler_files/ga.js" type="text/javascript"></script>
+<script type="text/javascript">
+try{
+var pageTracker = _gat._getTracker("UA-1518442-4");
+pageTracker._trackPageview();
+} catch(err) {}
+</script>
+
+
+
+    </div>
+  </body></html>
\ No newline at end of file
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/JMXHandler_1.png b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/JMXHandler_1.png
new file mode 100644
index 0000000..0b7e0e7
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/JMXHandler_1.png
Binary files differ
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/JMXHandler_2.png b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/JMXHandler_2.png
new file mode 100644
index 0000000..dc296a6
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/JMXHandler_2.png
Binary files differ
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/JMXHandler_3.png b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/JMXHandler_3.png
new file mode 100644
index 0000000..9b79470
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/JMXHandler_3.png
Binary files differ
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/apache.png b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/apache.png
new file mode 100644
index 0000000..5132f65
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/apache.png
Binary files differ
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/button.html b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/button.html
new file mode 100644
index 0000000..1721083
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/button.html
@@ -0,0 +1,2 @@
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8"></head><body></body></html>
\ No newline at end of file
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/button_data/2009-europe-125x125.png b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/button_data/2009-europe-125x125.png
new file mode 100644
index 0000000..654a99c
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/button_data/2009-europe-125x125.png
Binary files differ
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/feed-icon-32x32.png b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/feed-icon-32x32.png
new file mode 100644
index 0000000..ea50b84
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/feed-icon-32x32.png
Binary files differ
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/footer.png b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/footer.png
new file mode 100644
index 0000000..15be425
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/footer.png
Binary files differ
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/ga.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/ga.js
new file mode 100644
index 0000000..0501070
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/ga.js
@@ -0,0 +1,41 @@
+var _gat=new Object({c:"length",lb:"4.3.1",m:"cookie",b:undefined,cb:function(d,a){this.zb=d;this.Nb=a},r:"__utma=",W:"__utmb=",ma:"__utmc=",Ta:"__utmk=",na:"__utmv=",oa:"__utmx=",Sa:"GASO=",X:"__utmz=",lc:"http://www.google-analytics.com/__utm.gif",mc:"https://ssl.google-analytics.com/__utm.gif",Wa:"utmcid=",Ya:"utmcsr=",$a:"utmgclid=",Ua:"utmccn=",Xa:"utmcmd=",Za:"utmctr=",Va:"utmcct=",Hb:false,_gasoDomain:undefined,_gasoCPath:undefined,e:window,a:document,k:navigator,t:function(d){var a=1,c=0,h,
+o;if(!_gat.q(d)){a=0;for(h=d[_gat.c]-1;h>=0;h--){o=d.charCodeAt(h);a=(a<<6&268435455)+o+(o<<14);c=a&266338304;a=c!=0?a^c>>21:a}}return a},C:function(d,a,c){var h=_gat,o="-",k,l,s=h.q;if(!s(d)&&!s(a)&&!s(c)){k=h.w(d,a);if(k>-1){l=d.indexOf(c,k);if(l<0)l=d[h.c];o=h.F(d,k+h.w(a,"=")+1,l)}}return o},Ea:function(d){var a=false,c=0,h,o;if(!_gat.q(d)){a=true;for(h=0;h<d[_gat.c];h++){o=d.charAt(h);c+="."==o?1:0;a=a&&c<=1&&(0==h&&"-"==o||_gat.P(".0123456789",o))}}return a},d:function(d,a){var c=encodeURIComponent;
+return c instanceof Function?(a?encodeURI(d):c(d)):escape(d)},J:function(d,a){var c=decodeURIComponent,h;d=d.split("+").join(" ");if(c instanceof Function)try{h=a?decodeURI(d):c(d)}catch(o){h=unescape(d)}else h=unescape(d);return h},Db:function(d){return d&&d.hash?_gat.F(d.href,_gat.w(d.href,"#")):""},q:function(d){return _gat.b==d||"-"==d||""==d},Lb:function(d){return d[_gat.c]>0&&_gat.P(" \n\r\t",d)},P:function(d,a){return _gat.w(d,a)>-1},h:function(d,a){d[d[_gat.c]]=a},T:function(d){return d.toLowerCase()},
+z:function(d,a){return d.split(a)},w:function(d,a){return d.indexOf(a)},F:function(d,a,c){c=_gat.b==c?d[_gat.c]:c;return d.substring(a,c)},uc:function(){var d=_gat.b,a=window;if(a&&a.gaGlobal&&a.gaGlobal.hid)d=a.gaGlobal.hid;else{d=Math.round(Math.random()*2147483647);a.gaGlobal=a.gaGlobal?a.gaGlobal:{};a.gaGlobal.hid=d}return d},wa:function(){return Math.round(Math.random()*2147483647)},Gc:function(){return(_gat.wa()^_gat.vc())*2147483647},vc:function(){var d=_gat.k,a=_gat.a,c=_gat.e,h=a[_gat.m]?
+a[_gat.m]:"",o=c.history[_gat.c],k,l,s=[d.appName,d.version,d.language?d.language:d.browserLanguage,d.platform,d.userAgent,d.javaEnabled()?1:0].join("");if(c.screen)s+=c.screen.width+"x"+c.screen.height+c.screen.colorDepth;else if(c.java){l=java.awt.Toolkit.getDefaultToolkit().getScreenSize();s+=l.screen.width+"x"+l.screen.height}s+=h;s+=a.referrer?a.referrer:"";k=s[_gat.c];while(o>0)s+=o--^k++;return _gat.t(s)}});_gat.hc=function(){var d=this,a=_gat.cb;function c(h,o){return new a(h,o)}d.db="utm_campaign";d.eb="utm_content";d.fb="utm_id";d.gb="utm_medium";d.hb="utm_nooverride";d.ib="utm_source";d.jb="utm_term";d.kb="gclid";d.pa=0;d.I=0;d.wb="15768000";d.Tb="1800";d.ea=[];d.ga=[];d.Ic="cse";d.Gb="q";d.ab="google";d.fa=[c(d.ab,d.Gb),c("yahoo","p"),c("msn","q"),c("bing","q"),c("aol","query"),c("aol","encquery"),c("lycos","query"),c("ask","q"),c("altavista","q"),c("netscape","query"),c("cnn","query"),c("looksmart","qt"),c("about",
+"terms"),c("mamma","query"),c("alltheweb","q"),c("gigablast","q"),c("voila","rdata"),c("virgilio","qs"),c("live","q"),c("baidu","wd"),c("alice","qs"),c("yandex","text"),c("najdi","q"),c("aol","q"),c("club-internet","query"),c("mama","query"),c("seznam","q"),c("search","q"),c("wp","szukaj"),c("onet","qt"),c("netsprint","q"),c("google.interia","q"),c("szukacz","q"),c("yam","k"),c("pchome","q"),c("kvasir","searchExpr"),c("sesam","q"),c("ozu","q"),c("terra","query"),c("nostrum","query"),c("mynet","q"),
+c("ekolay","q"),c("search.ilse","search_for")];d.B=undefined;d.Kb=false;d.p="/";d.ha=100;d.Da="/__utm.gif";d.ta=1;d.ua=1;d.G="|";d.sa=1;d.qa=1;d.pb=1;d.g="auto";d.D=1;d.Ga=1000;d.Yc=10;d.nc=10;d.Zc=0.2};_gat.Y=function(d,a){var c,h,o,k,l,s,q,f=this,n=_gat,w=n.q,x=n.c,g,z=a;f.a=d;function B(i){var b=i instanceof Array?i.join("."):"";return w(b)?"-":b}function A(i,b){var e=[],j;if(!w(i)){e=n.z(i,".");if(b)for(j=0;j<e[x];j++)if(!n.Ea(e[j]))e[j]="-"}return e}function p(){return u(63072000000)}function u(i){var b=new Date,e=new Date(b.getTime()+i);return"expires="+e.toGMTString()+"; "}function m(i,b){f.a[n.m]=i+"; path="+z.p+"; "+b+f.Cc()}function r(i,b,e){var j=f.V,t,v;for(t=0;t<j[x];t++){v=j[t][0];
+v+=w(b)?b:b+j[t][4];j[t][2](n.C(i,v,e))}}f.Jb=function(){return n.b==g||g==f.t()};f.Ba=function(){return l?l:"-"};f.Wb=function(i){l=i};f.Ma=function(i){g=n.Ea(i)?i*1:"-"};f.Aa=function(){return B(s)};f.Na=function(i){s=A(i)};f.Hc=function(){return g?g:"-"};f.Cc=function(){return w(z.g)?"":"domain="+z.g+";"};f.ya=function(){return B(c)};f.Ub=function(i){c=A(i,1)};f.K=function(){return B(h)};f.La=function(i){h=A(i,1)};f.za=function(){return B(o)};f.Vb=function(i){o=A(i,1)};f.Ca=function(){return B(k)};
+f.Xb=function(i){k=A(i);for(var b=0;b<k[x];b++)if(b<4&&!n.Ea(k[b]))k[b]="-"};f.Dc=function(){return q};f.Uc=function(i){q=i};f.pc=function(){c=[];h=[];o=[];k=[];l=n.b;s=[];g=n.b};f.t=function(){var i="",b;for(b=0;b<f.V[x];b++)i+=f.V[b][1]();return n.t(i)};f.Ha=function(i){var b=f.a[n.m],e=false;if(b){r(b,i,";");f.Ma(f.t());e=true}return e};f.Rc=function(i){r(i,"","&");f.Ma(n.C(i,n.Ta,"&"))};f.Wc=function(){var i=f.V,b=[],e;for(e=0;e<i[x];e++)n.h(b,i[e][0]+i[e][1]());n.h(b,n.Ta+f.t());return b.join("&")};
+f.bd=function(i,b){var e=f.V,j=z.p,t;f.Ha(i);z.p=b;for(t=0;t<e[x];t++)if(!w(e[t][1]()))e[t][3]();z.p=j};f.dc=function(){m(n.r+f.ya(),p())};f.Pa=function(){m(n.W+f.K(),u(z.Tb*1000))};f.ec=function(){m(n.ma+f.za(),"")};f.Ra=function(){m(n.X+f.Ca(),u(z.wb*1000))};f.fc=function(){m(n.oa+f.Ba(),p())};f.Qa=function(){m(n.na+f.Aa(),p())};f.cd=function(){m(n.Sa+f.Dc(),"")};f.V=[[n.r,f.ya,f.Ub,f.dc,"."],[n.W,f.K,f.La,f.Pa,""],[n.ma,f.za,f.Vb,f.ec,""],[n.oa,f.Ba,f.Wb,f.fc,""],[n.X,f.Ca,f.Xb,f.Ra,"."],[n.na,
+f.Aa,f.Na,f.Qa,"."]]};_gat.jc=function(d){var a=this,c=_gat,h=d,o,k=function(l){var s=(new Date).getTime(),q;q=(s-l[3])*(h.Zc/1000);if(q>=1){l[2]=Math.min(Math.floor(l[2]*1+q),h.nc);l[3]=s}return l};a.O=function(l,s,q,f,n,w,x){var g,z=h.D,B=q.location;if(!o)o=new c.Y(q,h);o.Ha(f);g=c.z(o.K(),".");if(g[1]<500||n){if(w)g=k(g);if(n||!w||g[2]>=1){if(!n&&w)g[2]=g[2]*1-1;g[1]=g[1]*1+1;l="?utmwv="+_gat.lb+"&utmn="+c.wa()+(c.q(B.hostname)?"":"&utmhn="+c.d(B.hostname))+(h.ha==100?"":"&utmsp="+c.d(h.ha))+l;if(0==z||2==z){var A=
+new Image(1,1);A.src=h.Da+l;var p=2==z?function(){}:x||function(){};A.onload=p}if(1==z||2==z){var u=new Image(1,1);u.src=("https:"==B.protocol?c.mc:c.lc)+l+"&utmac="+s+"&utmcc="+a.wc(q,f);u.onload=x||function(){}}}}o.La(g.join("."));o.Pa()};a.wc=function(l,s){var q=[],f=[c.r,c.X,c.na,c.oa],n,w=l[c.m],x;for(n=0;n<f[c.c];n++){x=c.C(w,f[n]+s,";");if(!c.q(x))c.h(q,f[n]+x+";")}return c.d(q.join("+"))}};_gat.i=function(){this.la=[]};_gat.i.bb=function(d,a,c,h,o,k){var l=this;l.cc=d;l.Oa=a;l.L=c;l.sb=h;l.Pb=o;l.Qb=k};_gat.i.bb.prototype.S=function(){var d=this,a=_gat.d;return"&"+["utmt=item","utmtid="+a(d.cc),"utmipc="+a(d.Oa),"utmipn="+a(d.L),"utmiva="+a(d.sb),"utmipr="+a(d.Pb),"utmiqt="+a(d.Qb)].join("&")};_gat.i.$=function(d,a,c,h,o,k,l,s){var q=this;q.v=d;q.ob=a;q.bc=c;q.ac=h;q.Yb=o;q.ub=k;q.$b=l;q.xb=s;q.ca=[]};_gat.i.$.prototype.mb=function(d,a,c,h,o){var k=this,l=k.Eb(d),s=k.v,q=_gat;if(q.b==
+l)q.h(k.ca,new q.i.bb(s,d,a,c,h,o));else{l.cc=s;l.Oa=d;l.L=a;l.sb=c;l.Pb=h;l.Qb=o}};_gat.i.$.prototype.Eb=function(d){var a,c=this.ca,h;for(h=0;h<c[_gat.c];h++)a=d==c[h].Oa?c[h]:a;return a};_gat.i.$.prototype.S=function(){var d=this,a=_gat.d;return"&"+["utmt=tran","utmtid="+a(d.v),"utmtst="+a(d.ob),"utmtto="+a(d.bc),"utmttx="+a(d.ac),"utmtsp="+a(d.Yb),"utmtci="+a(d.ub),"utmtrg="+a(d.$b),"utmtco="+a(d.xb)].join("&")};_gat.i.prototype.nb=function(d,a,c,h,o,k,l,s){var q=this,f=_gat,n=q.xa(d);if(f.b==
+n){n=new f.i.$(d,a,c,h,o,k,l,s);f.h(q.la,n)}else{n.ob=a;n.bc=c;n.ac=h;n.Yb=o;n.ub=k;n.$b=l;n.xb=s}return n};_gat.i.prototype.xa=function(d){var a,c=this.la,h;for(h=0;h<c[_gat.c];h++)a=d==c[h].v?c[h]:a;return a};_gat.gc=function(d){var a=this,c="-",h=_gat,o=d;a.Ja=screen;a.qb=!self.screen&&self.java?java.awt.Toolkit.getDefaultToolkit():h.b;a.a=document;a.e=window;a.k=navigator;a.Ka=c;a.Sb=c;a.tb=c;a.Ob=c;a.Mb=1;a.Bb=c;function k(){var l,s,q,f,n="ShockwaveFlash",w="$version",x=a.k?a.k.plugins:h.b;if(x&&x[h.c]>0)for(l=0;l<x[h.c]&&!q;l++){s=x[l];if(h.P(s.name,"Shockwave Flash"))q=h.z(s.description,"Shockwave Flash ")[1]}else{n=n+"."+n;try{f=new ActiveXObject(n+".7");q=f.GetVariable(w)}catch(g){}if(!q)try{f=
+new ActiveXObject(n+".6");q="WIN 6,0,21,0";f.AllowScriptAccess="always";q=f.GetVariable(w)}catch(z){}if(!q)try{f=new ActiveXObject(n);q=f.GetVariable(w)}catch(z){}if(q){q=h.z(h.z(q," ")[1],",");q=q[0]+"."+q[1]+" r"+q[2]}}return q?q:c}a.xc=function(){var l;if(self.screen){a.Ka=a.Ja.width+"x"+a.Ja.height;a.Sb=a.Ja.colorDepth+"-bit"}else if(a.qb)try{l=a.qb.getScreenSize();a.Ka=l.width+"x"+l.height}catch(s){}a.Ob=h.T(a.k&&a.k.language?a.k.language:(a.k&&a.k.browserLanguage?a.k.browserLanguage:c));a.Mb=
+a.k&&a.k.javaEnabled()?1:0;a.Bb=o?k():c;a.tb=h.d(a.a.characterSet?a.a.characterSet:(a.a.charset?a.a.charset:c))};a.Xc=function(){return"&"+["utmcs="+h.d(a.tb),"utmsr="+a.Ka,"utmsc="+a.Sb,"utmul="+a.Ob,"utmje="+a.Mb,"utmfl="+h.d(a.Bb)].join("&")}};_gat.n=function(d,a,c,h,o){var k=this,l=_gat,s=l.q,q=l.b,f=l.P,n=l.C,w=l.T,x=l.z,g=l.c;k.a=a;k.f=d;k.Rb=c;k.ja=h;k.o=o;function z(p){return s(p)||"0"==p||!f(p,"://")}function B(p){var u="";p=w(x(p,"://")[1]);if(f(p,"/")){p=x(p,"/")[1];if(f(p,"?"))u=x(p,"?")[0]}return u}function A(p){var u="";u=w(x(p,"://")[1]);if(f(u,"/"))u=x(u,"/")[0];return u}k.Fc=function(p){var u=k.Fb(),m=k.o;return new l.n.s(n(p,m.fb+"=","&"),n(p,m.ib+"=","&"),n(p,m.kb+"=","&"),k.ba(p,m.db,"(not set)"),k.ba(p,m.gb,"(not set)"),
+k.ba(p,m.jb,u&&!s(u.R)?l.J(u.R):q),k.ba(p,m.eb,q))};k.Ib=function(p){var u=A(p),m=B(p);if(f(u,k.o.ab)){p=x(p,"?").join("&");if(f(p,"&"+k.o.Gb+"="))if(m==k.o.Ic)return true}return false};k.Fb=function(){var p,u,m=k.Rb,r,i,b=k.o.fa;if(z(m)||k.Ib(m))return;p=A(m);for(r=0;r<b[g];r++){i=b[r];if(f(p,w(i.zb))){m=x(m,"?").join("&");if(f(m,"&"+i.Nb+"=")){u=x(m,"&"+i.Nb+"=")[1];if(f(u,"&"))u=x(u,"&")[0];return new l.n.s(q,i.zb,q,"(organic)","organic",u,q)}}}};k.ba=function(p,u,m){var r=n(p,u+"=","&"),i=!s(r)?
+l.J(r):(!s(m)?m:"-");return i};k.Nc=function(p){var u=k.o.ea,m=false,r,i;if(p&&"organic"==p.da){r=w(l.J(p.R));for(i=0;i<u[g];i++)m=m||w(u[i])==r}return m};k.Ec=function(){var p="",u="",m=k.Rb;if(z(m)||k.Ib(m))return;p=w(x(m,"://")[1]);if(f(p,"/")){u=l.F(p,l.w(p,"/"));if(f(u,"?"))u=x(u,"?")[0];p=x(p,"/")[0]}if(0==l.w(p,"www."))p=l.F(p,4);return new l.n.s(q,p,q,"(referral)","referral",q,u)};k.sc=function(p){var u="";if(k.o.pa){u=l.Db(p);u=""!=u?u+"&":u}u+=p.search;return u};k.zc=function(){return new l.n.s(q,
+"(direct)",q,"(direct)","(none)",q,q)};k.Oc=function(p){var u=false,m,r,i=k.o.ga;if(p&&"referral"==p.da){m=w(l.d(p.ia));for(r=0;r<i[g];r++)u=u||f(m,w(i[r]))}return u};k.U=function(p){return q!=p&&p.Fa()};k.yc=function(p,u){var m="",r="-",i,b,e=0,j,t,v=k.f;if(!p)return"";t=k.a[l.m]?k.a[l.m]:"";m=k.sc(k.a.location);if(k.o.I&&p.Jb()){r=p.Ca();if(!s(r)&&!f(r,";")){p.Ra();return""}}r=n(t,l.X+v+".",";");i=k.Fc(m);if(k.U(i)){b=n(m,k.o.hb+"=","&");if("1"==b&&!s(r))return""}if(!k.U(i)){i=k.Fb();if(!s(r)&&
+k.Nc(i))return""}if(!k.U(i)&&u){i=k.Ec();if(!s(r)&&k.Oc(i))return""}if(!k.U(i))if(s(r)&&u)i=k.zc();if(!k.U(i))return"";if(!s(r)){var y=x(r,"."),E=new l.n.s;E.Cb(y.slice(4).join("."));j=w(E.ka())==w(i.ka());e=y[3]*1}if(!j||u){var F=n(t,l.r+v+".",";"),I=F.lastIndexOf("."),G=I>9?l.F(F,I+1)*1:0;e++;G=0==G?1:G;p.Xb([v,k.ja,G,e,i.ka()].join("."));p.Ra();return"&utmcn=1"}else return"&utmcr=1"}};_gat.n.s=function(d,a,c,h,o,k,l){var s=this;s.v=d;s.ia=a;s.ra=c;s.L=h;s.da=o;s.R=k;s.vb=l};_gat.n.s.prototype.ka=
+function(){var d=this,a=_gat,c=[],h=[[a.Wa,d.v],[a.Ya,d.ia],[a.$a,d.ra],[a.Ua,d.L],[a.Xa,d.da],[a.Za,d.R],[a.Va,d.vb]],o,k;if(d.Fa())for(o=0;o<h[a.c];o++)if(!a.q(h[o][1])){k=h[o][1].split("+").join("%20");k=k.split(" ").join("%20");a.h(c,h[o][0]+k)}return c.join("|")};_gat.n.s.prototype.Fa=function(){var d=this,a=_gat.q;return!(a(d.v)&&a(d.ia)&&a(d.ra))};_gat.n.s.prototype.Cb=function(d){var a=this,c=_gat,h=function(o){return c.J(c.C(d,o,"|"))};a.v=h(c.Wa);a.ia=h(c.Ya);a.ra=h(c.$a);a.L=h(c.Ua);a.da=
+h(c.Xa);a.R=h(c.Za);a.vb=h(c.Va)};_gat.Z=function(){var d=this,a=_gat,c={},h="k",o="v",k=[h,o],l="(",s=")",q="*",f="!",n="'",w={};w[n]="'0";w[s]="'1";w[q]="'2";w[f]="'3";var x=1;function g(m,r,i,b){if(a.b==c[m])c[m]={};if(a.b==c[m][r])c[m][r]=[];c[m][r][i]=b}function z(m,r,i){return a.b!=c[m]&&a.b!=c[m][r]?c[m][r][i]:a.b}function B(m,r){if(a.b!=c[m]&&a.b!=c[m][r]){c[m][r]=a.b;var i=true,b;for(b=0;b<k[a.c];b++)if(a.b!=c[m][k[b]]){i=false;break}if(i)c[m]=a.b}}function A(m){var r="",i=false,b,e;for(b=0;b<k[a.c];b++){e=m[k[b]];if(a.b!=
+e){if(i)r+=k[b];r+=p(e);i=false}else i=true}return r}function p(m){var r=[],i,b;for(b=0;b<m[a.c];b++)if(a.b!=m[b]){i="";if(b!=x&&a.b==m[b-1]){i+=b.toString();i+=f}i+=u(m[b]);a.h(r,i)}return l+r.join(q)+s}function u(m){var r="",i,b,e;for(i=0;i<m[a.c];i++){b=m.charAt(i);e=w[b];r+=a.b!=e?e:b}return r}d.Kc=function(m){return a.b!=c[m]};d.N=function(){var m=[],r;for(r in c)if(a.b!=c[r])a.h(m,r.toString()+A(c[r]));return m.join("")};d.Sc=function(m){if(m==a.b)return d.N();var r=[m.N()],i;for(i in c)if(a.b!=
+c[i]&&!m.Kc(i))a.h(r,i.toString()+A(c[i]));return r.join("")};d._setKey=function(m,r,i){if(typeof i!="string")return false;g(m,h,r,i);return true};d._setValue=function(m,r,i){if(typeof i!="number"&&(a.b==Number||!(i instanceof Number)))return false;if(Math.round(i)!=i||i==NaN||i==Infinity)return false;g(m,o,r,i.toString());return true};d._getKey=function(m,r){return z(m,h,r)};d._getValue=function(m,r){return z(m,o,r)};d._clearKey=function(m){B(m,h)};d._clearValue=function(m){B(m,o)}};_gat.ic=function(d,a){var c=this;c.jd=a;c.Pc=d;c._trackEvent=function(h,o,k){return a._trackEvent(c.Pc,h,o,k)}};_gat.kc=function(d){var a=this,c=_gat,h=c.b,o=c.q,k=c.w,l=c.F,s=c.C,q=c.P,f=c.z,n="location",w=c.c,x=h,g=new c.hc,z=false;a.a=document;a.e=window;a.ja=Math.round((new Date).getTime()/1000);a.H=d;a.yb=a.a.referrer;a.va=h;a.j=h;a.A=h;a.M=false;a.aa=h;a.rb="";a.l=h;a.Ab=h;a.f=h;a.u=h;function B(){if("auto"==g.g){var b=a.a.domain;if("www."==l(b,0,4))b=l(b,4);g.g=b}g.g=c.T(g.g)}function A(){var b=g.g,e=k(b,"www.google.")*k(b,".google.")*k(b,"google.");return e||"/"!=g.p||k(b,"google.org")>-1}function p(b,
+e,j){if(o(b)||o(e)||o(j))return"-";var t=s(b,c.r+a.f+".",e),v;if(!o(t)){v=f(t,".");v[5]=v[5]?v[5]*1+1:1;v[3]=v[4];v[4]=j;t=v.join(".")}return t}function u(){return"file:"!=a.a[n].protocol&&A()}function m(b){if(!b||""==b)return"";while(c.Lb(b.charAt(0)))b=l(b,1);while(c.Lb(b.charAt(b[w]-1)))b=l(b,0,b[w]-1);return b}function r(b,e,j){if(!o(b())){e(c.J(b()));if(!q(b(),";"))j()}}function i(b){var e,j=""!=b&&a.a[n].host!=b;if(j)for(e=0;e<g.B[w];e++)j=j&&k(c.T(b),c.T(g.B[e]))==-1;return j}a.Bc=function(){if(!g.g||
+""==g.g||"none"==g.g){g.g="";return 1}B();return g.pb?c.t(g.g):1};a.tc=function(b,e){if(o(b))b="-";else{e+=g.p&&"/"!=g.p?g.p:"";var j=k(b,e);b=j>=0&&j<=8?"0":("["==b.charAt(0)&&"]"==b.charAt(b[w]-1)?"-":b)}return b};a.Ia=function(b){var e="",j=a.a;e+=a.aa?a.aa.Xc():"";e+=g.qa?a.rb:"";e+=g.ta&&!o(j.title)?"&utmdt="+c.d(j.title):"";e+="&utmhid="+c.uc()+"&utmr="+a.va+"&utmp="+a.Tc(b);return e};a.Tc=function(b){var e=a.a[n];b=h!=b&&""!=b?c.d(b,true):c.d(e.pathname+unescape(e.search),true);return b};a.$c=
+function(b){if(a.Q()){var e="";if(a.l!=h&&a.l.N().length>0)e+="&utme="+c.d(a.l.N());e+=a.Ia(b);x.O(e,a.H,a.a,a.f)}};a.qc=function(){var b=new c.Y(a.a,g);return b.Ha(a.f)?b.Wc():h};a._getLinkerUrl=function(b,e){var j=f(b,"#"),t=b,v=a.qc();if(v)if(e&&1>=j[w])t+="#"+v;else if(!e||1>=j[w])if(1>=j[w])t+=(q(b,"?")?"&":"?")+v;else t=j[0]+(q(b,"?")?"&":"?")+v+"#"+j[1];return t};a.Zb=function(){var b;if(a.A&&a.A[w]>=10&&!q(a.A,"=")){a.u.Uc(a.A);a.u.cd();c._gasoDomain=g.g;c._gasoCPath=g.p;b=a.a.createElement("script");
+b.type="text/javascript";b.id="_gasojs";b.src="https://www.google.com/analytics/reporting/overlay_js?gaso="+a.A+"&"+c.wa();a.a.getElementsByTagName("head")[0].appendChild(b)}};a.Jc=function(){var b=a.a[c.m],e=a.ja,j=a.u,t=a.f+"",v=a.e,y=v?v.gaGlobal:h,E,F=q(b,c.r+t+"."),I=q(b,c.W+t),G=q(b,c.ma+t),C,D=[],H="",K=false,J;b=o(b)?"":b;if(g.I){E=c.Db(a.a[n]);if(g.pa&&!o(E))H=E+"&";H+=a.a[n].search;if(!o(H)&&q(H,c.r)){j.Rc(H);if(!j.Jb())j.pc();C=j.ya()}r(j.Ba,j.Wb,j.fc);r(j.Aa,j.Na,j.Qa)}if(!o(C))if(o(j.K())||
+o(j.za())){C=p(H,"&",e);a.M=true}else{D=f(j.K(),".");t=D[0]}else if(F)if(!I||!G){C=p(b,";",e);a.M=true}else{C=s(b,c.r+t+".",";");D=f(s(b,c.W+t,";"),".")}else{C=[t,c.Gc(),e,e,e,1].join(".");a.M=true;K=true}C=f(C,".");if(v&&y&&y.dh==t){C[4]=y.sid?y.sid:C[4];if(K){C[3]=y.sid?y.sid:C[4];if(y.vid){J=f(y.vid,".");C[1]=J[0];C[2]=J[1]}}}j.Ub(C.join("."));D[0]=t;D[1]=D[1]?D[1]:0;D[2]=undefined!=D[2]?D[2]:g.Yc;D[3]=D[3]?D[3]:C[4];j.La(D.join("."));j.Vb(t);if(!o(j.Hc()))j.Ma(j.t());j.dc();j.Pa();j.ec()};a.Lc=
+function(){x=new c.jc(g)};a._initData=function(){var b;if(!z){a.Lc();a.f=a.Bc();a.u=new c.Y(a.a,g)}if(u())a.Jc();if(!z){if(u()){a.va=a.tc(a.Ac(),a.a.domain);if(g.sa){a.aa=new c.gc(g.ua);a.aa.xc()}if(g.qa){b=new c.n(a.f,a.a,a.va,a.ja,g);a.rb=b.yc(a.u,a.M)}}a.l=new c.Z;a.Ab=new c.Z;z=true}if(!c.Hb)a.Mc()};a._visitCode=function(){a._initData();var b=s(a.a[c.m],c.r+a.f+".",";"),e=f(b,".");return e[w]<4?"":e[1]};a._cookiePathCopy=function(b){a._initData();if(a.u)a.u.bd(a.f,b)};a.Mc=function(){var b=a.a[n].hash,
+e;e=b&&""!=b&&0==k(b,"#gaso=")?s(b,"gaso=","&"):s(a.a[c.m],c.Sa,";");if(e[w]>=10){a.A=e;if(a.e.addEventListener)a.e.addEventListener("load",a.Zb,false);else a.e.attachEvent("onload",a.Zb)}c.Hb=true};a.Q=function(){return a._visitCode()%10000<g.ha*100};a.Vc=function(){var b,e,j=a.a.links;if(!g.Kb){var t=a.a.domain;if("www."==l(t,0,4))t=l(t,4);g.B.push("."+t)}for(b=0;b<j[w]&&(g.Ga==-1||b<g.Ga);b++){e=j[b];if(i(e.host))if(!e.gatcOnclick){e.gatcOnclick=e.onclick?e.onclick:a.Qc;e.onclick=function(v){var y=
+!this.target||this.target=="_self"||this.target=="_top"||this.target=="_parent";y=y&&!a.oc(v);a.ad(v,this,y);return y?false:(this.gatcOnclick?this.gatcOnclick(v):true)}}}};a.Qc=function(){};a._trackPageview=function(b){if(u()){a._initData();if(g.B)a.Vc();a.$c(b);a.M=false}};a._trackTrans=function(){var b=a.f,e=[],j,t,v,y;a._initData();if(a.j&&a.Q()){for(j=0;j<a.j.la[w];j++){t=a.j.la[j];c.h(e,t.S());for(v=0;v<t.ca[w];v++)c.h(e,t.ca[v].S())}for(y=0;y<e[w];y++)x.O(e[y],a.H,a.a,b,true)}};a._setTrans=
+function(){var b=a.a,e,j,t,v,y=b.getElementById?b.getElementById("utmtrans"):(b.utmform&&b.utmform.utmtrans?b.utmform.utmtrans:h);a._initData();if(y&&y.value){a.j=new c.i;v=f(y.value,"UTM:");g.G=!g.G||""==g.G?"|":g.G;for(e=0;e<v[w];e++){v[e]=m(v[e]);j=f(v[e],g.G);for(t=0;t<j[w];t++)j[t]=m(j[t]);if("T"==j[0])a._addTrans(j[1],j[2],j[3],j[4],j[5],j[6],j[7],j[8]);else if("I"==j[0])a._addItem(j[1],j[2],j[3],j[4],j[5],j[6])}}};a._addTrans=function(b,e,j,t,v,y,E,F){a.j=a.j?a.j:new c.i;return a.j.nb(b,e,
+j,t,v,y,E,F)};a._addItem=function(b,e,j,t,v,y){var E;a.j=a.j?a.j:new c.i;E=a.j.xa(b);if(!E)E=a._addTrans(b,"","","","","","","");E.mb(e,j,t,v,y)};a._setVar=function(b){if(b&&""!=b&&A()){a._initData();var e=new c.Y(a.a,g),j=a.f;e.Na(j+"."+c.d(b));e.Qa();if(a.Q())x.O("&utmt=var",a.H,a.a,a.f)}};a._link=function(b,e){if(g.I&&b){a._initData();a.a[n].href=a._getLinkerUrl(b,e)}};a._linkByPost=function(b,e){if(g.I&&b&&b.action){a._initData();b.action=a._getLinkerUrl(b.action,e)}};a._setXKey=function(b,e,
+j){a.l._setKey(b,e,j)};a._setXValue=function(b,e,j){a.l._setValue(b,e,j)};a._getXKey=function(b,e){return a.l._getKey(b,e)};a._getXValue=function(b,e){return a.l.getValue(b,e)};a._clearXKey=function(b){a.l._clearKey(b)};a._clearXValue=function(b){a.l._clearValue(b)};a._createXObj=function(){a._initData();return new c.Z};a._sendXEvent=function(b){var e="";a._initData();if(a.Q()){e+="&utmt=event&utme="+c.d(a.l.Sc(b))+a.Ia();x.O(e,a.H,a.a,a.f,false,true)}};a._createEventTracker=function(b){a._initData();
+return new c.ic(b,a)};a._trackEvent=function(b,e,j,t){var v=true,y=a.Ab;if(h!=b&&h!=e&&""!=b&&""!=e){y._clearKey(5);y._clearValue(5);v=y._setKey(5,1,b)?v:false;v=y._setKey(5,2,e)?v:false;v=h==j||y._setKey(5,3,j)?v:false;v=h==t||y._setValue(5,1,t)?v:false;if(v)a._sendXEvent(y)}else v=false;return v};a.ad=function(b,e,j){a._initData();if(a.Q()){var t=new c.Z;t._setKey(6,1,e.href);var v=j?function(){a.rc(b,e)}:undefined;x.O("&utmt=event&utme="+c.d(t.N())+a.Ia(),a.H,a.a,a.f,false,true,v)}};a.rc=function(b,
+e){if(!b)b=a.e.event;var j=true;if(e.gatcOnclick)j=e.gatcOnclick(b);if(j||typeof j=="undefined")if(!e.target||e.target=="_self")a.e.location=e.href;else if(e.target=="_top")a.e.top.document.location=e.href;else if(e.target=="_parent")a.e.parent.document.location=e.href};a.oc=function(b){if(!b)b=a.e.event;var e=b.shiftKey||b.ctrlKey||b.altKey;if(!e)if(b.modifiers&&a.e.Event)e=b.modifiers&a.e.Event.CONTROL_MASK||b.modifiers&a.e.Event.SHIFT_MASK||b.modifiers&a.e.Event.ALT_MASK;return e};a._setDomainName=
+function(b){g.g=b};a.dd=function(){return g.g};a._addOrganic=function(b,e){c.h(g.fa,new c.cb(b,e))};a._clearOrganic=function(){g.fa=[]};a.hd=function(){return g.fa};a._addIgnoredOrganic=function(b){c.h(g.ea,b)};a._clearIgnoredOrganic=function(){g.ea=[]};a.ed=function(){return g.ea};a._addIgnoredRef=function(b){c.h(g.ga,b)};a._clearIgnoredRef=function(){g.ga=[]};a.fd=function(){return g.ga};a._setAllowHash=function(b){g.pb=b?1:0};a._setCampaignTrack=function(b){g.qa=b?1:0};a._setClientInfo=function(b){g.sa=
+b?1:0};a._getClientInfo=function(){return g.sa};a._setCookiePath=function(b){g.p=b};a._setTransactionDelim=function(b){g.G=b};a._setCookieTimeout=function(b){g.wb=b};a._setDetectFlash=function(b){g.ua=b?1:0};a._getDetectFlash=function(){return g.ua};a._setDetectTitle=function(b){g.ta=b?1:0};a._getDetectTitle=function(){return g.ta};a._setLocalGifPath=function(b){g.Da=b};a._getLocalGifPath=function(){return g.Da};a._setLocalServerMode=function(){g.D=0};a._setRemoteServerMode=function(){g.D=1};a._setLocalRemoteServerMode=
+function(){g.D=2};a.gd=function(){return g.D};a._getServiceMode=function(){return g.D};a._setSampleRate=function(b){g.ha=b};a._setSessionTimeout=function(b){g.Tb=b};a._setAllowLinker=function(b){g.I=b?1:0};a._setAllowAnchor=function(b){g.pa=b?1:0};a._setCampNameKey=function(b){g.db=b};a._setCampContentKey=function(b){g.eb=b};a._setCampIdKey=function(b){g.fb=b};a._setCampMediumKey=function(b){g.gb=b};a._setCampNOKey=function(b){g.hb=b};a._setCampSourceKey=function(b){g.ib=b};a._setCampTermKey=function(b){g.jb=
+b};a._setCampCIdKey=function(b){g.kb=b};a._getAccount=function(){return a.H};a._getVersion=function(){return _gat.lb};a.kd=function(b){g.B=[];if(b)g.B=b};a.md=function(b){g.Kb=b};a.ld=function(b){g.Ga=b};a._setReferrerOverride=function(b){a.yb=b};a.Ac=function(){return a.yb}};_gat._getTracker=function(d){var a=new _gat.kc(d);return a};
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/header.png b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/header.png
new file mode 100644
index 0000000..977712b
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/header.png
Binary files differ
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/hoverIntent.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/hoverIntent.js
new file mode 100644
index 0000000..91da57b
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/hoverIntent.js
@@ -0,0 +1,84 @@
+(function($){
+	/* hoverIntent by Brian Cherne */
+	$.fn.hoverIntent = function(f,g) {
+		// default configuration options
+		var cfg = {
+			sensitivity: 7,
+			interval: 100,
+			timeout: 0
+		};
+		// override configuration options with user supplied object
+		cfg = $.extend(cfg, g ? { over: f, out: g } : f );
+
+		// instantiate variables
+		// cX, cY = current X and Y position of mouse, updated by mousemove event
+		// pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
+		var cX, cY, pX, pY;
+
+		// A private function for getting mouse position
+		var track = function(ev) {
+			cX = ev.pageX;
+			cY = ev.pageY;
+		};
+
+		// A private function for comparing current and previous mouse position
+		var compare = function(ev,ob) {
+			ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
+			// compare mouse positions to see if they've crossed the threshold
+			if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
+				$(ob).unbind("mousemove",track);
+				// set hoverIntent state to true (so mouseOut can be called)
+				ob.hoverIntent_s = 1;
+				return cfg.over.apply(ob,[ev]);
+			} else {
+				// set previous coordinates for next time
+				pX = cX; pY = cY;
+				// use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
+				ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
+			}
+		};
+
+		// A private function for delaying the mouseOut function
+		var delay = function(ev,ob) {
+			ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
+			ob.hoverIntent_s = 0;
+			return cfg.out.apply(ob,[ev]);
+		};
+
+		// A private function for handling mouse 'hovering'
+		var handleHover = function(e) {
+			// next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut
+			var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
+			while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } }
+			if ( p == this ) { return false; }
+
+			// copy objects to be passed into t (required for event object to be passed in IE)
+			var ev = jQuery.extend({},e);
+			var ob = this;
+
+			// cancel hoverIntent timer if it exists
+			if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }
+
+			// else e.type == "onmouseover"
+			if (e.type == "mouseover") {
+				// set "previous" X and Y position based on initial entry point
+				pX = ev.pageX; pY = ev.pageY;
+				// update "current" X and Y position based on mousemove
+				$(ob).bind("mousemove",track);
+				// start polling interval (self-calling timeout) to compare mouse coordinates over time
+				if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}
+
+			// else e.type == "onmouseout"
+			} else {
+				// unbind expensive mousemove event
+				$(ob).unbind("mousemove",track);
+				// if hoverIntent state is true, then call the mouseOut function after the specified delay
+				if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
+			}
+		};
+
+		// bind the function to the two event listeners
+		return this.mouseover(handleHover).mouseout(handleHover);
+	};
+	
+})(jQuery);
\ No newline at end of file
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/information.gif b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/information.gif
new file mode 100644
index 0000000..072ab66
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/information.gif
Binary files differ
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/ipojo.png b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/ipojo.png
new file mode 100644
index 0000000..8f8d89e
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/ipojo.png
Binary files differ
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/jquery-1.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/jquery-1.js
new file mode 100644
index 0000000..b1ae21d
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/jquery-1.js
@@ -0,0 +1,19 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.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\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<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>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
\ No newline at end of file
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/linkext7.gif b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/linkext7.gif
new file mode 100644
index 0000000..f2dd2dc
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/linkext7.gif
Binary files differ
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/logo.png b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/logo.png
new file mode 100644
index 0000000..dccbddc
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/logo.png
Binary files differ
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushCSharp.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushCSharp.js
new file mode 100644
index 0000000..f45540f
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushCSharp.js
@@ -0,0 +1,30 @@
+dp.sh.Brushes.CSharp = function()

+{

+	var keywords =	'abstract as base bool break byte case catch char checked class const ' +

+					'continue decimal default delegate do double else enum event explicit ' +

+					'extern false finally fixed float for foreach get goto if implicit in int ' +

+					'interface internal is lock long namespace new null object operator out ' +

+					'override params private protected public readonly ref return sbyte sealed set ' +

+					'short sizeof stackalloc static string struct switch this throw true try ' +

+					'typeof uint ulong unchecked unsafe ushort using virtual void while';

+

+	this.regexList = [

+		// There's a slight problem with matching single line comments and figuring out

+		// a difference between // and ///. Using lookahead and lookbehind solves the

+		// problem, unfortunately JavaScript doesn't support lookbehind. So I'm at a 

+		// loss how to translate that regular expression to JavaScript compatible one.

+//		{ regex: new RegExp('(?<!/)//(?!/).*$|(?<!/)////(?!/).*$|/\\*[^\\*]*(.)*?\\*/', 'gm'),	css: 'comment' },			// one line comments starting with anything BUT '///' and multiline comments

+//		{ regex: new RegExp('(?<!/)///(?!/).*$', 'gm'),											css: 'comments' },		// XML comments starting with ///

+

+		{ regex: new RegExp('//.*$', 'gm'),							css: 'comment' },			// one line comments

+		{ regex: new RegExp('/\\*[\\s\\S]*?\\*/', 'g'),				css: 'comment' },			// multiline comments

+		{ regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'),				css: 'string' },			// strings

+		{ regex: new RegExp('^\\s*#.*', 'gm'),						css: 'preprocessor' },		// preprocessor tags like #region and #endregion

+		{ regex: new RegExp(this.GetKeywords(keywords), 'gm'),		css: 'keyword' }			// c# keyword

+		];

+

+	this.CssClass = 'dp-c';

+}

+

+dp.sh.Brushes.CSharp.prototype	= new dp.sh.Highlighter();

+dp.sh.Brushes.CSharp.Aliases	= ['c#', 'c-sharp', 'csharp'];

diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushDelphi.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushDelphi.js
new file mode 100644
index 0000000..efeb2f7
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushDelphi.js
@@ -0,0 +1,31 @@
+/* Delphi brush is contributed by Eddie Shipman */

+dp.sh.Brushes.Delphi = function()

+{

+	var keywords =	'abs addr and ansichar ansistring array as asm begin boolean byte cardinal ' +

+					'case char class comp const constructor currency destructor div do double ' +

+					'downto else end except exports extended false file finalization finally ' +

+					'for function goto if implementation in inherited int64 initialization ' +

+					'integer interface is label library longint longword mod nil not object ' +

+					'of on or packed pansichar pansistring pchar pcurrency pdatetime pextended ' + 

+					'pint64 pointer private procedure program property pshortstring pstring ' + 

+					'pvariant pwidechar pwidestring protected public published raise real real48 ' +

+					'record repeat set shl shortint shortstring shr single smallint string then ' +

+					'threadvar to true try type unit until uses val var varirnt while widechar ' +

+					'widestring with word write writeln xor';

+

+	this.regexList = [

+		{ regex: new RegExp('\\(\\*[\\s\\S]*?\\*\\)', 'gm'),		css: 'comment' },  			// multiline comments (* *)

+		{ regex: new RegExp('{(?!\\$)[\\s\\S]*?}', 'gm'),			css: 'comment' },  			// multiline comments { }

+		{ regex: new RegExp('//.*$', 'gm'),							css: 'comment' },  			// one line

+		{ regex: new RegExp('\'(?:\\.|[^\\\'\'])*\'', 'g'),			css: 'string' },			// strings

+		{ regex: new RegExp('\\{\\$[a-zA-Z]+ .+\\}', 'g'),			css: 'directive' },			// Compiler Directives and Region tags

+		{ regex: new RegExp('\\b[\\d\\.]+\\b', 'g'),				css: 'number' },			// numbers 12345

+		{ regex: new RegExp('\\$[a-zA-Z0-9]+\\b', 'g'),				css: 'number' },			// numbers $F5D3

+		{ regex: new RegExp(this.GetKeywords(keywords), 'gm'),		css: 'keyword' }			// keyword

+		];

+

+	this.CssClass = 'dp-delphi';

+}

+

+dp.sh.Brushes.Delphi.prototype	= new dp.sh.Highlighter();

+dp.sh.Brushes.Delphi.Aliases	= ['delphi', 'pascal'];

diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushJScript.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushJScript.js
new file mode 100644
index 0000000..4ef8b9b
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushJScript.js
@@ -0,0 +1,22 @@
+dp.sh.Brushes.JScript = function()

+{

+	var keywords =	'abstract boolean break byte case catch char class const continue debugger ' +

+					'default delete do double else enum export extends false final finally float ' +

+					'for function goto if implements import in instanceof int interface long native ' +

+					'new null package private protected public return short static super switch ' +

+					'synchronized this throw throws transient true try typeof var void volatile while with';

+

+	this.regexList = [

+		{ regex: new RegExp('//.*$', 'gm'),							css: 'comment' },			// one line comments

+		{ regex: new RegExp('/\\*[\\s\\S]*?\\*/', 'g'),				css: 'comment' },			// multiline comments

+		{ regex: new RegExp('"(?:[^"\n]|[\"])*?"', 'g'),			css: 'string' },			// double quoted strings

+		{ regex: new RegExp("'(?:[^'\n]|[\'])*?'", 'g'),			css: 'string' },			// single quoted strings

+		{ regex: new RegExp('^\\s*#.*', 'gm'),						css: 'preprocessor' },		// preprocessor tags like #region and #endregion

+		{ regex: new RegExp(this.GetKeywords(keywords), 'gm'),		css: 'keyword' }			// keywords

+		];

+

+	this.CssClass = 'dp-c';

+}

+

+dp.sh.Brushes.JScript.prototype	= new dp.sh.Highlighter();

+dp.sh.Brushes.JScript.Aliases	= ['js', 'jscript', 'javascript'];

diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushJava.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushJava.js
new file mode 100644
index 0000000..b75d334
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushJava.js
@@ -0,0 +1,22 @@
+dp.sh.Brushes.Java = function()
+{
+	var keywords =	'abstract assert boolean break byte case catch char class const' +
+                    'continue default do double else enum extends false final finally float' +
+                    'for goto if implements import instanceof inst interface log native' +
+                    'new null package private protected public return short static strictfp super' +
+                    'switch synchronized this throw throws transient true try void volatile while';
+
+    this.regexList = [
+		{ regex: new RegExp('//.*$', 'gm'),							css: 'comment' },			// one line comments
+		{ regex: new RegExp('/\\*[\\s\\S]*?\\*/', 'g'),				css: 'comment' },			// multiline comments
+		{ regex: new RegExp('"(?:[^"\n]|[\"])*?"', 'g'),			css: 'string' },			// double quoted strings
+		{ regex: new RegExp("'(?:[^'\n]|[\'])*?'", 'g'),			css: 'string' },			// single quoted strings
+		{ regex: new RegExp('^\\s*@.*', 'gm'),						css: 'preprocessor' },		// preprocessor tags like @see
+		{ regex: new RegExp(this.GetKeywords(keywords), 'gm'),		css: 'keyword' }			// keywords
+		];
+
+	this.CssClass = 'dp-c';
+}
+
+dp.sh.Brushes.Java.prototype	= new dp.sh.Highlighter();
+dp.sh.Brushes.Java.Aliases	    = ['java'];
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushPhp.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushPhp.js
new file mode 100644
index 0000000..57c85d4
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushPhp.js
@@ -0,0 +1,23 @@
+dp.sh.Brushes.Php = function()

+{

+	var keywords =	'and or xor __FILE__ __LINE__ array as break case ' +

+					'cfunction class const continue declare default die do echo else ' +

+					'elseif empty enddeclare endfor endforeach endif endswitch endwhile eval exit ' +

+					'extends for foreach function global if include include_once isset list ' +

+					'new old_function print require require_once return static switch unset use ' +

+					'var while __FUNCTION__ __CLASS__';

+

+	this.regexList = [

+		{ regex: new RegExp('//.*$', 'gm'),							css: 'comment' },			// one line comments

+		{ regex: new RegExp('/\\*[\\s\\S]*?\\*/', 'g'),				css: 'comment' },			// multiline comments

+		{ regex: new RegExp('"(?:[^"\n]|[\"])*?"', 'g'),			css: 'string' },			// double quoted strings

+		{ regex: new RegExp("'(?:[^'\n]|[\'])*?'", 'g'),			css: 'string' },			// single quoted strings

+		{ regex: new RegExp('\\$\\w+', 'g'),						css: 'vars' },				// variables

+		{ regex: new RegExp(this.GetKeywords(keywords), 'gm'),		css: 'keyword' }			// keyword

+		];

+

+	this.CssClass = 'dp-c';

+}

+

+dp.sh.Brushes.Php.prototype	= new dp.sh.Highlighter();

+dp.sh.Brushes.Php.Aliases	= ['php'];

diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushPython.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushPython.js
new file mode 100644
index 0000000..1d61339
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushPython.js
@@ -0,0 +1,71 @@
+/* Python 2.3 syntax contributed by Gheorghe Milas */

+dp.sh.Brushes.Python = function()

+{

+	var keywords =		'and assert break class continue def del elif else except exec ' +

+						'finally for from global if import in is lambda not or object pass print ' +

+						'raise return try yield while';

+	

+	var builtins =		'self __builtin__ __dict__ __future__ __methods__ __members__ __author__ __email__ __version__' +

+						'__class__ __bases__ __import__ __main__ __name__ __doc__ __self__ __debug__ __slots__ ' +

+						'abs append apply basestring bool buffer callable chr classmethod clear close cmp coerce compile complex ' +

+						'conjugate copy count delattr dict dir divmod enumerate Ellipsis eval execfile extend False file fileno filter float flush ' +

+						'get getattr globals has_key hasarttr hash hex id index input insert int intern isatty isinstance isubclass ' +

+						'items iter keys len list locals long map max min mode oct open ord pop pow property range ' +

+						'raw_input read readline readlines reduce reload remove repr reverse round seek setattr slice sum ' +

+						'staticmethod str super tell True truncate tuple type unichr unicode update values write writelines xrange zip';

+	

+	var magicmethods =	'__abs__ __add__ __and__ __call__ __cmp__ __coerce__ __complex__ __concat__ __contains__ __del__ __delattr__ __delitem__ ' +

+						'__delslice__ __div__ __divmod__ __float__ __getattr__ __getitem__ __getslice__ __hash__ __hex__ __eq__ __le__ __lt__ __gt__ __ge__ ' +

+						'__iadd__ __isub__ __imod__ __idiv__ __ipow__ __iand__ __ior__ __ixor__ __ilshift__ __irshift__ ' +

+						'__invert__ __init__ __int__ __inv__ __iter__ __len__ __long__ __lshift__ __mod__ __mul__ __new__ __neg__ __nonzero__ __oct__ __or__ ' +

+						'__pos__ __pow__ __radd__ __rand__ __rcmp__ __rdiv__ __rdivmod__ __repeat__ __repr__ __rlshift__ __rmod__ __rmul__ ' +

+						'__ror__ __rpow__ __rrshift__ __rshift__ __rsub__ __rxor__ __setattr__ __setitem__ __setslice__ __str__ __sub__ __xor__';

+	

+	var exceptions =	'Exception StandardError ArithmeticError LookupError EnvironmentError AssertionError AttributeError EOFError ' +

+						'FutureWarning IndentationError OverflowWarning PendingDeprecationWarning ReferenceError RuntimeWarning ' +

+						'SyntaxWarning TabError UnicodeDecodeError UnicodeEncodeError UnicodeTranslateError UserWarning Warning ' +

+						'IOError ImportError IndexError KeyError KeyboardInterrupt MemoryError NameError NotImplementedError OSError ' +

+						'RuntimeError StopIteration SyntaxError SystemError SystemExit TypeError UnboundLocalError UnicodeError ValueError ' +

+						'FloatingPointError OverflowError WindowsError ZeroDivisionError';

+	

+	var types =			'NoneType TypeType IntType LongType FloatType ComplexType StringType UnicodeType BufferType TupleType ListType ' +

+						'DictType FunctionType LambdaType CodeType ClassType UnboundMethodType InstanceType MethodType BuiltinFunctionType BuiltinMethodType ' +

+						'ModuleType FileType XRangeType TracebackType FrameType SliceType EllipsisType';

+	

+	var commonlibs =	'anydbm array asynchat asyncore AST base64 binascii binhex bisect bsddb buildtools bz2 ' +

+						'BaseHTTPServer Bastion calendar cgi cmath cmd codecs codeop commands compiler copy copy_reg ' +

+						'cPickle crypt cStringIO csv curses Carbon CGIHTTPServer ConfigParser Cookie datetime dbhash ' +

+						'dbm difflib dircache distutils doctest DocXMLRPCServer email encodings errno exceptions fcntl ' +

+						'filecmp fileinput ftplib gc gdbm getopt getpass glob gopherlib gzip heapq htmlentitydefs ' +

+						'htmllib httplib HTMLParser imageop imaplib imgfile imghdr imp inspect itertools jpeg keyword ' +

+						'linecache locale logging mailbox mailcap marshal math md5 mhlib mimetools mimetypes mimify mmap ' +

+						'mpz multifile mutex MimeWriter netrc new nis nntplib nsremote operator optparse os parser pickle pipes ' +

+						'popen2 poplib posix posixfile pprint preferences profile pstats pwd pydoc pythonprefs quietconsole ' +

+						'quopri Queue random re readline resource rexec rfc822 rgbimg sched select sets sgmllib sha shelve shutil ' +

+						'signal site smtplib socket stat statcache string struct symbol sys syslog SimpleHTTPServer ' +

+						'SimpleXMLRPCServer SocketServer StringIO tabnanny tarfile telnetlib tempfile termios textwrap ' +

+						'thread threading time timeit token tokenize traceback tty types Tkinter unicodedata unittest ' +

+						'urllib urllib2 urlparse user UserDict UserList UserString warnings weakref webbrowser whichdb ' +

+						'xml xmllib xmlrpclib xreadlines zipfile zlib';

+

+	this.regexList = [

+		{ regex: new RegExp('#.*$', 'gm'),								css: 'comment' },			// comments

+		{ regex: new RegExp('^\\s*"""(.|\n)*?"""\\s*$', 'gm'),			css: 'docstring' },			// documentation string "

+		{ regex: new RegExp('^\\s*\'\'\'(.|\n)*?\'\'\'\\s*$', 'gm'),	css: 'docstring' },			// documentation string '

+		{ regex: new RegExp('"""(.|\n)*?"""', 'g'),						css: 'string' },			// multi-line strings "

+		{ regex: new RegExp('\'\'\'(.|\n)*?\'\'\'', 'g'),				css: 'string' },			// multi-line strings '

+		{ regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'),					css: 'string' },			// strings "

+		{ regex: new RegExp('\'(?:\\.|[^\\\'\'])*\'', 'g'),				css: 'string' },			// strings '

+		{ regex: new RegExp(this.GetKeywords(keywords), 'gm'),			css: 'keyword' },			// keywords

+		{ regex: new RegExp(this.GetKeywords(builtins), 'gm'),			css: 'builtins' },			// builtin objects, functions, methods, magic attributes

+		{ regex: new RegExp(this.GetKeywords(magicmethods), 'gm'),		css: 'magicmethods' },		// special methods

+		{ regex: new RegExp(this.GetKeywords(exceptions), 'gm'),		css: 'exceptions' },		// standard exception classes

+		{ regex: new RegExp(this.GetKeywords(types), 'gm'),				css: 'types' },				// types from types.py

+		{ regex: new RegExp(this.GetKeywords(commonlibs), 'gm'),		css: 'commonlibs' }			// common standard library modules

+		];

+

+	this.CssClass = 'dp-py';

+}

+

+dp.sh.Brushes.Python.prototype	= new dp.sh.Highlighter();

+dp.sh.Brushes.Python.Aliases	= ['py', 'python'];

diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushShell.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushShell.js
new file mode 100644
index 0000000..5e7c2ef
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushShell.js
@@ -0,0 +1,27 @@
+dp.sh.Brushes.Shell = function()
+{
+	var keywords =	'alias array autor base basename break ' +
+                    'cat catv cd chdir cmpv continue conv copy ' +
+                    'crc ctime cut dirname echo env eval exec else if elif then ' +
+                    'export expr extern false fmode fork fprint ' +
+                    'fsize fstat fullname global goend goto grep ifdef ' +
+                    'ifset ifenv inv kill line link list ' +
+                    'local localset mkdirs mktemp move mtime nop print ' +
+                    'prints pwd read readc readl readonly rel ' +
+                    'remove return seek set shift sleep sortl ' +
+                    'static stime sum system systime tee test times ' +
+                    'tr trap true type typeset tz umask unalias ' +
+                    'unexport unset unsetenv ver wait wc whence ' +
+                    'sane exit prompt let';
+
+
+	this.regexList = [
+		{ regex: new RegExp('#.*$', 'gm'),							css: 'comment' },  			// one line
+		{ regex: new RegExp(this.GetKeywords(keywords), 'gm'),		css: 'keyword' }			// keyword
+		];
+
+	this.CssClass = 'dp-shell';
+}
+
+dp.sh.Brushes.Shell.prototype	= new dp.sh.Highlighter();
+dp.sh.Brushes.Shell.Aliases	= ['shell'];
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushSql.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushSql.js
new file mode 100644
index 0000000..4855d0c
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushSql.js
@@ -0,0 +1,40 @@
+dp.sh.Brushes.Sql = function()

+{

+	var funcs	=	'abs avg case cast coalesce convert count current_timestamp ' +

+					'current_user day isnull left lower month nullif replace right ' +

+					'session_user space substring sum system_user upper user year';

+

+	var keywords =	'absolute action add after alter as asc at authorization begin bigint ' +

+					'binary bit by cascade char character check checkpoint close collate ' +

+					'column commit committed connect connection constraint contains continue ' +

+					'create cube current current_date current_time cursor database date ' +

+					'deallocate dec decimal declare default delete desc distinct double drop ' +

+					'dynamic else end end-exec escape except exec execute false fetch first ' +

+					'float for force foreign forward free from full function global goto grant ' +

+					'group grouping having hour ignore index inner insensitive insert instead ' +

+					'int integer intersect into is isolation key last level load local max min ' +

+					'minute modify move name national nchar next no numeric of off on only ' +

+					'open option order out output partial password precision prepare primary ' +

+					'prior privileges procedure public read real references relative repeatable ' +

+					'restrict return returns revoke rollback rollup rows rule schema scroll ' +

+					'second section select sequence serializable set size smallint static ' +

+					'statistics table temp temporary then time timestamp to top transaction ' +

+					'translation trigger true truncate uncommitted union unique update values ' +

+					'varchar varying view when where with work';

+

+	var operators =	'all and any between cross in join like not null or outer some';

+

+	this.regexList = [

+		{ regex: new RegExp('--(.*)$', 'gm'),						css: 'comment' },			// one line and multiline comments

+		{ regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'),				css: 'string' },			// strings

+		{ regex: new RegExp('\'(?:\\.|[^\\\'\'])*\'', 'g'),			css: 'string' },			// strings

+		{ regex: new RegExp(this.GetKeywords(funcs), 'gmi'),		css: 'func' },				// functions

+		{ regex: new RegExp(this.GetKeywords(operators), 'gmi'),	css: 'op' },				// operators and such

+		{ regex: new RegExp(this.GetKeywords(keywords), 'gmi'),		css: 'keyword' }			// keyword

+		];

+

+	this.CssClass = 'dp-sql';

+}

+

+dp.sh.Brushes.Sql.prototype	= new dp.sh.Highlighter();

+dp.sh.Brushes.Sql.Aliases	= ['sql'];

diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushVb.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushVb.js
new file mode 100644
index 0000000..431e16f
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushVb.js
@@ -0,0 +1,29 @@
+dp.sh.Brushes.Vb = function()

+{

+	var keywords =	'AddHandler AddressOf AndAlso Alias And Ansi As Assembly Auto ' +

+					'Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate ' +

+					'CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr CType ' +

+					'Date Decimal Declare Default Delegate Dim DirectCast Do Double Each ' +

+					'Else ElseIf End Enum Erase Error Event Exit False Finally For Friend ' +

+					'Function Get GetType GoSub GoTo Handles If Implements Imports In ' +

+					'Inherits Integer Interface Is Let Lib Like Long Loop Me Mod Module ' +

+					'MustInherit MustOverride MyBase MyClass Namespace New Next Not Nothing ' +

+					'NotInheritable NotOverridable Object On Option Optional Or OrElse ' +

+					'Overloads Overridable Overrides ParamArray Preserve Private Property ' +

+					'Protected Public RaiseEvent ReadOnly ReDim REM RemoveHandler Resume ' +

+					'Return Select Set Shadows Shared Short Single Static Step Stop String ' +

+					'Structure Sub SyncLock Then Throw To True Try TypeOf Unicode Until ' +

+					'Variant When While With WithEvents WriteOnly Xor';

+

+	this.regexList = [

+		{ regex: new RegExp('\'.*$', 'gm'),							css: 'comment' },			// one line comments

+		{ regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'),				css: 'string' },			// strings

+		{ regex: new RegExp('^\\s*#.*', 'gm'),						css: 'preprocessor' },		// preprocessor tags like #region and #endregion

+		{ regex: new RegExp(this.GetKeywords(keywords), 'gm'),		css: 'keyword' }			// c# keyword

+		];

+

+	this.CssClass = 'dp-vb';

+}

+

+dp.sh.Brushes.Vb.prototype	= new dp.sh.Highlighter();

+dp.sh.Brushes.Vb.Aliases	= ['vb', 'vb.net'];

diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushXml.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushXml.js
new file mode 100644
index 0000000..941ad57
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shBrushXml.js
@@ -0,0 +1,61 @@
+dp.sh.Brushes.Xml = function()

+{

+	this.CssClass = 'dp-xml';

+}

+

+dp.sh.Brushes.Xml.prototype	= new dp.sh.Highlighter();

+dp.sh.Brushes.Xml.Aliases	= ['xml', 'xhtml', 'xslt', 'html', 'xhtml'];

+

+dp.sh.Brushes.Xml.prototype.ProcessRegexList = function()

+{

+	function push(array, value)

+	{

+		array[array.length] = value;

+	}

+	

+	/* If only there was a way to get index of a group within a match, the whole XML

+	   could be matched with the expression looking something like that:

+	

+	   (<!\[CDATA\[\s*.*\s*\]\]>)

+	   | (<!--\s*.*\s*?-->)

+	   | (<)*(\w+)*\s*(\w+)\s*=\s*(".*?"|'.*?'|\w+)(/*>)*

+	   | (</?)(.*?)(/?>)

+	*/

+	var index	= 0;

+	var match	= null;

+	var regex	= null;

+

+	// Match CDATA in the following format <![ ... [ ... ]]>

+	// <\!\[[\w\s]*?\[(.|\s)*?\]\]>

+	this.GetMatches(new RegExp('<\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\]>', 'gm'), 'cdata');

+	

+	// Match comments

+	// <!--\s*.*\s*?-->

+	this.GetMatches(new RegExp('<!--\\s*.*\\s*?-->', 'gm'), 'comments');

+

+	// Match attributes and their values

+	// (\w+)\s*=\s*(".*?"|\'.*?\'|\w+)*

+	regex = new RegExp('([\\w-\.]+)\\s*=\\s*(".*?"|\'.*?\'|\\w+)*', 'gm');

+	while((match = regex.exec(this.code)) != null)

+	{

+		push(this.matches, new dp.sh.Match(match[1], match.index, 'attribute'));

+	

+		// if xml is invalid and attribute has no property value, ignore it	

+		if(match[2] != undefined)

+		{

+			push(this.matches, new dp.sh.Match(match[2], match.index + match[0].indexOf(match[2]), 'attribute-value'));

+		}

+	}

+

+	// Match opening and closing tag brackets

+	// </*\?*(?!\!)|/*\?*>

+	this.GetMatches(new RegExp('</*\\?*(?!\\!)|/*\\?*>', 'gm'), 'tag');

+

+	// Match tag names

+	// </*\?*\s*(\w+)

+	regex = new RegExp('</*\\?*\\s*([\\w-\.]+)', 'gm');

+	while((match = regex.exec(this.code)) != null)

+	{

+		push(this.matches, new dp.sh.Match(match[1], match.index + match[0].indexOf(match[1]), 'tag-name'));

+	}

+}

diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shCore.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shCore.js
new file mode 100644
index 0000000..b27395e
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/shCore.js
@@ -0,0 +1,622 @@
+/**

+ * Code Syntax Highlighter.

+ * Version 1.3.0

+ * Copyright (C) 2004 Alex Gorbatchev.

+ * http://www.dreamprojections.com/syntaxhighlighter/

+ * 

+ * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General 

+ * Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) 

+ * any later version.

+ *

+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied 

+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 

+ * details.

+ *

+ * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to 

+ * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 

+ */

+

+//

+// create namespaces

+//

+var dp = {

+	sh :					// dp.sh

+	{

+		Utils	: {},		// dp.sh.Utils

+		Brushes	: {},		// dp.sh.Brushes

+		Strings : {},

+		Version : '1.3.0'

+	}

+};

+

+dp.sh.Strings = {

+	AboutDialog : '<html><head><title>About...</title></head><body class="dp-about"><table cellspacing="0"><tr><td class="copy"><p class="title">dp.SyntaxHighlighter</div><div class="para">Version: {V}</p><p><a href="http://www.dreamprojections.com/syntaxhighlighter/?ref=about" target="_blank">http://www.dreamprojections.com/SyntaxHighlighter</a></p>&copy;2004-2005 Alex Gorbatchev. All right reserved.</td></tr><tr><td class="footer"><input type="button" class="close" value="OK" onClick="window.close()"/></td></tr></table></body></html>',

+	

+	// tools

+	ExpandCode : '+ expand code',

+	ViewPlain : 'view plain',

+	Print : 'print',

+	CopyToClipboard : 'copy to clipboard',

+	About : '?',

+	

+	CopiedToClipboard : 'The code is in your clipboard now.'

+};

+

+dp.SyntaxHighlighter = dp.sh;

+

+//

+// Dialog and toolbar functions

+//

+

+dp.sh.Utils.Expand = function(sender)

+{

+	var table = sender;

+	var span = sender;

+

+	// find the span in which the text label and pipe contained so we can hide it

+	while(span != null && span.tagName != 'SPAN')

+		span = span.parentNode;

+

+	// find the table

+	while(table != null && table.tagName != 'TABLE')

+		table = table.parentNode;

+	

+	// remove the 'expand code' button

+	span.parentNode.removeChild(span);

+	

+	table.tBodies[0].className = 'show';

+	table.parentNode.style.height = '100%'; // containing div isn't getting updated properly when the TBODY is shown

+}

+

+// opens a new windows and puts the original unformatted source code inside.

+dp.sh.Utils.ViewSource = function(sender)

+{

+	var code = sender.parentNode.originalCode;

+	var wnd = window.open('', '_blank', 'width=750, height=400, location=0, resizable=1, menubar=0, scrollbars=1');

+	

+	code = code.replace(/</g, '&lt;');

+	

+	wnd.document.write('<pre>' + code + '</pre>');

+	wnd.document.close();

+}

+

+// copies the original source code in to the clipboard (IE only)

+dp.sh.Utils.ToClipboard = function(sender)

+{

+	var code = sender.parentNode.originalCode;

+	

+	// This works only for IE. There's a way to make it work with Mozilla as well,

+	// but it requires security settings changed on the client, which isn't by

+	// default, so 99% of users won't have it working anyways.

+	if(window.clipboardData)

+	{

+		window.clipboardData.setData('text', code);

+		

+		alert(dp.sh.Strings.CopiedToClipboard);

+	}

+}

+

+// creates an invisible iframe, puts the original source code inside and prints it

+dp.sh.Utils.PrintSource = function(sender)

+{

+	var td		= sender.parentNode;

+	var code	= td.processedCode;

+	var iframe	= document.createElement('IFRAME');

+	var doc		= null;

+	var wnd		= 

+

+	// this hides the iframe

+	iframe.style.cssText = 'position:absolute; width:0px; height:0px; left:-5px; top:-5px;';

+	

+	td.appendChild(iframe);

+	

+	doc = iframe.contentWindow.document;

+	code = code.replace(/</g, '&lt;');

+	

+	doc.open();

+	doc.write('<pre>' + code + '</pre>');

+	doc.close();

+	

+	iframe.contentWindow.focus();

+	iframe.contentWindow.print();

+	

+	td.removeChild(iframe);

+}

+

+dp.sh.Utils.About = function()

+{

+	var wnd	= window.open('', '_blank', 'dialog,width=320,height=150,scrollbars=0');

+	var doc	= wnd.document;

+	

+	var styles = document.getElementsByTagName('style');

+	var links = document.getElementsByTagName('link');

+	

+	doc.write(dp.sh.Strings.AboutDialog.replace('{V}', dp.sh.Version));

+	

+	// copy over ALL the styles from the parent page

+	for(var i = 0; i < styles.length; i++)

+		doc.write('<style>' + styles[i].innerHTML + '</style>');

+

+	for(var i = 0; i < links.length; i++)

+		if(links[i].rel.toLowerCase() == 'stylesheet')

+			doc.write('<link type="text/css" rel="stylesheet" href="' + links[i].href + '"></link>');

+	

+	doc.close();

+	wnd.focus();

+}

+

+//

+// Match object

+//

+dp.sh.Match = function(value, index, css)

+{

+	this.value		= value;

+	this.index		= index;

+	this.length		= value.length;

+	this.css		= css;

+}

+

+//

+// Highlighter object

+//

+dp.sh.Highlighter = function()

+{

+	this.addGutter = true;

+	this.addControls = true;

+	this.collapse = false;

+	this.tabsToSpaces = true;

+}

+

+// static callback for the match sorting

+dp.sh.Highlighter.SortCallback = function(m1, m2)

+{

+	// sort matches by index first

+	if(m1.index < m2.index)

+		return -1;

+	else if(m1.index > m2.index)

+		return 1;

+	else

+	{

+		// if index is the same, sort by length

+		if(m1.length < m2.length)

+			return -1;

+		else if(m1.length > m2.length)

+			return 1;

+	}

+	return 0;

+}

+

+// gets a list of all matches for a given regular expression

+dp.sh.Highlighter.prototype.GetMatches = function(regex, css)

+{

+	var index = 0;

+	var match = null;

+

+	while((match = regex.exec(this.code)) != null)

+	{

+		this.matches[this.matches.length] = new dp.sh.Match(match[0], match.index, css);

+	}

+}

+

+dp.sh.Highlighter.prototype.AddBit = function(str, css)

+{

+	var span = document.createElement('span');

+	

+	str = str.replace(/&/g, '&amp;');

+	str = str.replace(/ /g, '&nbsp;');

+	str = str.replace(/</g, '&lt;');

+	str = str.replace(/\n/gm, '&nbsp;<br>');

+

+	// when adding a piece of code, check to see if it has line breaks in it 

+	// and if it does, wrap individual line breaks with span tags

+	if(css != null)

+	{

+		var regex = new RegExp('<br>', 'gi');

+		

+		if(regex.test(str))

+		{

+			var lines = str.split('&nbsp;<br>');

+			

+			str = '';

+			

+			for(var i = 0; i < lines.length; i++)

+			{

+				span			= document.createElement('SPAN');

+				span.className	= css;

+				span.innerHTML	= lines[i];

+				

+				this.div.appendChild(span);

+				

+				// don't add a <BR> for the last line

+				if(i + 1 < lines.length)

+					this.div.appendChild(document.createElement('BR'));

+			}

+		}

+		else

+		{

+			span.className = css;

+			span.innerHTML = str;

+			this.div.appendChild(span);

+		}

+	}

+	else

+	{

+		span.innerHTML = str;

+		this.div.appendChild(span);

+	}

+}

+

+// checks if one match is inside any other match

+dp.sh.Highlighter.prototype.IsInside = function(match)

+{

+	if(match == null || match.length == 0)

+		return;

+	

+	for(var i = 0; i < this.matches.length; i++)

+	{

+		var c = this.matches[i];

+		

+		if(c == null)

+			continue;

+		

+		if((match.index > c.index) && (match.index <= c.index + c.length))

+			return true;

+	}

+	

+	return false;

+}

+

+dp.sh.Highlighter.prototype.ProcessRegexList = function()

+{

+	for(var i = 0; i < this.regexList.length; i++)

+		this.GetMatches(this.regexList[i].regex, this.regexList[i].css);

+}

+

+dp.sh.Highlighter.prototype.ProcessSmartTabs = function(code)

+{

+	var lines	= code.split('\n');

+	var result	= '';

+	var tabSize	= 4;

+	var tab		= '\t';

+

+	// This function inserts specified amount of spaces in the string

+	// where a tab is while removing that given tab. 

+	function InsertSpaces(line, pos, count)

+	{

+		var left	= line.substr(0, pos);

+		var right	= line.substr(pos + 1, line.length);	// pos + 1 will get rid of the tab

+		var spaces	= '';

+		

+		for(var i = 0; i < count; i++)

+			spaces += ' ';

+		

+		return left + spaces + right;

+	}

+

+	// This function process one line for 'smart tabs'

+	function ProcessLine(line, tabSize)

+	{

+		if(line.indexOf(tab) == -1)

+			return line;

+

+		var pos = 0;

+

+		while((pos = line.indexOf(tab)) != -1)

+		{

+			// This is pretty much all there is to the 'smart tabs' logic.

+			// Based on the position within the line and size of a tab, 

+			// calculate the amount of spaces we need to insert.

+			var spaces = tabSize - pos % tabSize;

+			

+			line = InsertSpaces(line, pos, spaces);

+		}

+		

+		return line;

+	}

+

+	// Go through all the lines and do the 'smart tabs' magic.

+	for(var i = 0; i < lines.length; i++)

+		result += ProcessLine(lines[i], tabSize) + '\n';

+	

+	return result;

+}

+

+dp.sh.Highlighter.prototype.SwitchToTable = function()

+{

+	// thanks to Lachlan Donald from SitePoint.com for this <br/> tag fix.

+	var html	= this.div.innerHTML.replace(/<(br)\/?>/gi, '\n');

+	var lines	= html.split('\n');

+	var row		= null;

+	var cell	= null;

+	var tBody	= null;

+	var html	= '';

+	var pipe	= ' | ';

+

+	// creates an anchor to a utility

+	function UtilHref(util, text)

+	{

+		return '<a href="#" onclick="dp.sh.Utils.' + util + '(this); return false;">' + text + '</a>';

+	}

+	

+	tBody = document.createElement('TBODY');	// can be created and all others go to tBodies collection.

+

+	this.table.appendChild(tBody);

+		

+	if(this.addGutter == true)

+	{

+		row = tBody.insertRow(-1);

+		cell = row.insertCell(-1);

+		cell.className = 'tools-corner';

+	}

+

+	if(this.addControls == true)

+	{

+		var tHead = document.createElement('THEAD');	// controls will be placed in here

+		this.table.appendChild(tHead);

+

+		row = tHead.insertRow(-1);

+

+		// add corner if there's a gutter

+		if(this.addGutter == true)

+		{

+			cell = row.insertCell(-1);

+			cell.className = 'tools-corner';

+		}

+		

+		cell = row.insertCell(-1);

+		

+		// preserve some variables for the controls

+		cell.originalCode = this.originalCode;

+		cell.processedCode = this.code;

+		cell.className = 'tools';

+		

+		if(this.collapse == true)

+		{

+			tBody.className = 'hide';

+			cell.innerHTML += '<span><b>' + UtilHref('Expand', dp.sh.Strings.ExpandCode) + '</b>' + pipe + '</span>';

+		}

+

+		cell.innerHTML += UtilHref('ViewSource', dp.sh.Strings.ViewPlain) + pipe + UtilHref('PrintSource', dp.sh.Strings.Print);

+		

+		// IE has this clipboard object which is easy enough to use

+		if(window.clipboardData)

+			cell.innerHTML += pipe + UtilHref('ToClipboard', dp.sh.Strings.CopyToClipboard);

+		

+		cell.innerHTML += pipe + UtilHref('About', dp.sh.Strings.About);

+	}

+

+	for(var i = 0, lineIndex = this.firstLine; i < lines.length - 1; i++, lineIndex++)

+	{

+		row = tBody.insertRow(-1);

+		

+		if(this.addGutter == true)

+		{

+			cell = row.insertCell(-1);

+			cell.className = 'gutter';

+			cell.innerHTML = lineIndex;

+		}

+

+		cell = row.insertCell(-1);

+		cell.className = 'line' + (i % 2 + 1);		// uses .line1 and .line2 css styles for alternating lines

+		cell.innerHTML = lines[i];

+	}

+	

+	this.div.innerHTML	= '';

+}

+

+dp.sh.Highlighter.prototype.Highlight = function(code)

+{

+	function Trim(str)

+	{

+		return str.replace(/^\s*(.*?)[\s\n]*$/g, '$1');

+	}

+	

+	function Chop(str)

+	{

+		return str.replace(/\n*$/, '').replace(/^\n*/, '');

+	}

+

+	function Unindent(str)

+	{

+		var lines = str.split('\n');

+		var indents = new Array();

+		var regex = new RegExp('^\\s*', 'g');

+		var min = 1000;

+

+		// go through every line and check for common number of indents

+		for(var i = 0; i < lines.length && min > 0; i++)

+		{

+			if(Trim(lines[i]).length == 0)

+				continue;

+				

+			var matches = regex.exec(lines[i]);

+

+			if(matches != null && matches.length > 0)

+				min = Math.min(matches[0].length, min);

+		}

+

+		// trim minimum common number of white space from the begining of every line

+		if(min > 0)

+			for(var i = 0; i < lines.length; i++)

+				lines[i] = lines[i].substr(min);

+

+		return lines.join('\n');

+	}

+	

+	// This function returns a portions of the string from pos1 to pos2 inclusive

+	function Copy(string, pos1, pos2)

+	{

+		return string.substr(pos1, pos2 - pos1);

+	}

+

+	var pos	= 0;

+	

+	this.originalCode = code;

+	this.code = Chop(Unindent(code));

+	this.div = document.createElement('DIV');

+	this.table = document.createElement('TABLE');

+	this.matches = new Array();

+

+	if(this.CssClass != null)

+		this.table.className = this.CssClass;

+

+	// replace tabs with spaces

+	if(this.tabsToSpaces == true)

+		this.code = this.ProcessSmartTabs(this.code);

+

+	this.table.border = 0;

+	this.table.cellSpacing = 0;

+	this.table.cellPadding = 0;

+

+	this.ProcessRegexList();	

+

+	// if no matches found, add entire code as plain text

+	if(this.matches.length == 0)

+	{

+		this.AddBit(this.code, null);

+		this.SwitchToTable();

+		return;

+	}

+

+	// sort the matches

+	this.matches = this.matches.sort(dp.sh.Highlighter.SortCallback);

+

+	// The following loop checks to see if any of the matches are inside

+	// of other matches. This process would get rid of highligting strings

+	// inside comments, keywords inside strings and so on.

+	for(var i = 0; i < this.matches.length; i++)

+		if(this.IsInside(this.matches[i]))

+			this.matches[i] = null;

+

+	// Finally, go through the final list of matches and pull the all

+	// together adding everything in between that isn't a match.

+	for(var i = 0; i < this.matches.length; i++)

+	{

+		var match = this.matches[i];

+

+		if(match == null || match.length == 0)

+			continue;

+		

+		this.AddBit(Copy(this.code, pos, match.index), null);

+		this.AddBit(match.value, match.css);

+		

+		pos = match.index + match.length;

+	}

+	

+	this.AddBit(this.code.substr(pos), null);

+

+	this.SwitchToTable();

+}

+

+dp.sh.Highlighter.prototype.GetKeywords = function(str) 

+{

+	return '\\b' + str.replace(/ /g, '\\b|\\b') + '\\b';

+}

+

+// highlightes all elements identified by name and gets source code from specified property

+dp.sh.HighlightAll = function(name, showGutter /* optional */, showControls /* optional */, collapseAll /* optional */, firstLine /* optional */)

+{

+	function FindValue()

+	{

+		var a = arguments;

+		

+		for(var i = 0; i < a.length; i++)

+		{

+			if(a[i] == null)

+				continue;

+				

+			if(typeof(a[i]) == 'string' && a[i] != '')

+				return a[i] + '';

+		

+			if(typeof(a[i]) == 'object' && a[i].value != '')

+				return a[i].value + '';

+		}

+		

+		return null;

+	}

+	

+	function IsOptionSet(value, list)

+	{

+		for(var i = 0; i < list.length; i++)

+			if(list[i] == value)

+				return true;

+		

+		return false;

+	}

+	

+	function GetOptionValue(name, list, defaultValue)

+	{

+		var regex = new RegExp('^' + name + '\\[(\\w+)\\]$', 'gi');

+		var matches = null;

+

+		for(var i = 0; i < list.length; i++)

+			if((matches = regex.exec(list[i])) != null)

+				return matches[1];

+		

+		return defaultValue;

+	}

+

+	var elements = document.getElementsByName(name);

+	var highlighter = null;

+	var registered = new Object();

+	var propertyName = 'value';

+	

+	// if no code blocks found, leave

+	if(elements == null)

+		return;

+

+	// register all brushes

+	for(var brush in dp.sh.Brushes)

+	{

+		var aliases = dp.sh.Brushes[brush].Aliases;

+		

+		if(aliases == null)

+			continue;

+		

+		for(var i = 0; i < aliases.length; i++)

+			registered[aliases[i]] = brush;

+	}

+

+	for(var i = 0; i < elements.length; i++)

+	{

+		var element = elements[i];

+		var options = FindValue(

+				element.attributes['class'], element.className, 

+				element.attributes['language'], element.language

+				);

+		var language = '';

+		

+		if(options == null)

+			continue;

+		

+		options = options.split(':');

+		

+		language = options[0].toLowerCase();

+		

+		if(registered[language] == null)

+			continue;

+		

+		// instantiate a brush

+		highlighter = new dp.sh.Brushes[registered[language]]();

+		

+		// hide the original element

+		element.style.display = 'none';

+

+		highlighter.addGutter = (showGutter == null) ? !IsOptionSet('nogutter', options) : showGutter;

+		highlighter.addControls = (showControls == null) ? !IsOptionSet('nocontrols', options) : showControls;

+		highlighter.collapse = (collapseAll == null) ? IsOptionSet('collapse', options) : collapseAll;

+		

+		// first line idea comes from Andrew Collington, thanks!

+		highlighter.firstLine = (firstLine == null) ? parseInt(GetOptionValue('firstline', options, 1)) : firstLine;

+

+		highlighter.Highlight(element[propertyName]);

+

+		// place the result table inside a div

+		var div = document.createElement('DIV');

+		

+		div.className = 'dp-highlighter';

+		div.appendChild(highlighter.table);

+

+		element.parentNode.insertBefore(div, element);		

+	}	

+}

diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/site.css b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/site.css
new file mode 100644
index 0000000..959ab0a
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/site.css
@@ -0,0 +1,25 @@
+/* @override http://felix.apache.org/site/media.data/site.css */
+
+body { background-color: #ffffff; color: #3b3b3b; font-family: Tahoma, Arial, sans-serif; font-size: 10pt; line-height: 140% }
+h1, h2, h3, h4, h5, h6 { font-weight: normal; color: #000000; line-height: 100%; margin-top: 0px}
+h1 { font-size: 200% }
+h2 { font-size: 175% }
+h3 { font-size: 150% }
+h4 { font-size: 140% }
+h5 { font-size: 130% }
+h6 { font-size: 120% }
+a { color: #1980af }
+a:visited { color: #1980af }
+a:hover { color: #1faae9 }
+.title { position: absolute; left: 1px; right: 1px; top:25px; height: 81px; background: url(http://felix.apache.org/site/media.data/gradient.png) repeat-x; background-position: bottom; }
+.logo { position: absolute; width: 15em; height: 81px; text-align: center; }
+.header { text-align: right; margin-right: 20pt; margin-top: 30pt;}
+.menu { border-top: 10px solid #f9bb00; position: absolute; top: 107px; left: 1px; width: 15em; bottom: 0px; padding: 0px; background-color: #fcfcfc }
+.menu ul { background-color: #fdf5d9; list-style: none; padding-left: 4em; margin-top: 0px; padding-top: 2em; padding-bottom: 2em; margin-left: 0px; color: #4a4a43}
+.menu a { text-decoration: none; color: #4a4a43 }
+.main { position: absolute; border-top: 10px solid #cde0ea; top: 107px; left: 15em; right: 1px; margin-left: 2px; padding-right: 4em; padding-left: 1em; padding-top: 1em;}
+.code { background-color: #eeeeee; border: solid 1px black; padding: 0.5em }
+.code-keyword { color: #880000 }
+.code-quote { color: #008800 }
+.code-object { color: #0000dd }
+.code-java { margin: 0em }
\ No newline at end of file
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/superfish.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/superfish.js
new file mode 100644
index 0000000..c6a9c7d
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/superfish.js
@@ -0,0 +1,121 @@
+
+/*
+ * Superfish v1.4.8 - jQuery menu widget
+ * Copyright (c) 2008 Joel Birch
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * 	http://www.opensource.org/licenses/mit-license.php
+ * 	http://www.gnu.org/licenses/gpl.html
+ *
+ * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
+ */
+
+;(function($){
+	$.fn.superfish = function(op){
+
+		var sf = $.fn.superfish,
+			c = sf.c,
+			$arrow = $(['<span class="',c.arrowClass,'"> &#187;</span>'].join('')),
+			over = function(){
+				var $$ = $(this), menu = getMenu($$);
+				clearTimeout(menu.sfTimer);
+				$$.showSuperfishUl().siblings().hideSuperfishUl();
+			},
+			out = function(){
+				var $$ = $(this), menu = getMenu($$), o = sf.op;
+				clearTimeout(menu.sfTimer);
+				menu.sfTimer=setTimeout(function(){
+					o.retainPath=($.inArray($$[0],o.$path)>-1);
+					$$.hideSuperfishUl();
+					if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
+				},o.delay);	
+			},
+			getMenu = function($menu){
+				var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
+				sf.op = sf.o[menu.serial];
+				return menu;
+			},
+			addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); };
+			
+		return this.each(function() {
+			var s = this.serial = sf.o.length;
+			var o = $.extend({},sf.defaults,op);
+			o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
+				$(this).addClass([o.hoverClass,c.bcClass].join(' '))
+					.filter('li:has(ul)').removeClass(o.pathClass);
+			});
+			sf.o[s] = sf.op = o;
+			
+			$('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() {
+				if (o.autoArrows) addArrow( $('>a:first-child',this) );
+			})
+			.not('.'+c.bcClass)
+				.hideSuperfishUl();
+			
+			var $a = $('a',this);
+			$a.each(function(i){
+				var $li = $a.eq(i).parents('li');
+				$a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
+			});
+			o.onInit.call(this);
+			
+		}).each(function() {
+			var menuClasses = [c.menuClass];
+			if (sf.op.dropShadows  && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass);
+			$(this).addClass(menuClasses.join(' '));
+		});
+	};
+
+	var sf = $.fn.superfish;
+	sf.o = [];
+	sf.op = {};
+	sf.IE7fix = function(){
+		var o = sf.op;
+		if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined)
+			this.toggleClass(sf.c.shadowClass+'-off');
+		};
+	sf.c = {
+		bcClass     : 'sf-breadcrumb',
+		menuClass   : 'sf-js-enabled',
+		anchorClass : 'sf-with-ul',
+		arrowClass  : 'sf-sub-indicator',
+		shadowClass : 'sf-shadow'
+	};
+	sf.defaults = {
+		hoverClass	: 'sfHover',
+		pathClass	: 'overideThisToUse',
+		pathLevels	: 1,
+		delay		: 800,
+		animation	: {opacity:'show'},
+		speed		: 'normal',
+		autoArrows	: true,
+		dropShadows : true,
+		disableHI	: false,		// true disables hoverIntent detection
+		onInit		: function(){}, // callback functions
+		onBeforeShow: function(){},
+		onShow		: function(){},
+		onHide		: function(){}
+	};
+	$.fn.extend({
+		hideSuperfishUl : function(){
+			var o = sf.op,
+				not = (o.retainPath===true) ? o.$path : '';
+			o.retainPath = false;
+			var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
+					.find('>ul').hide().css('visibility','hidden');
+			o.onHide.call($ul);
+			return this;
+		},
+		showSuperfishUl : function(){
+			var o = sf.op,
+				sh = sf.c.shadowClass+'-off',
+				$ul = this.addClass(o.hoverClass)
+					.find('>ul:hidden').css('visibility','visible');
+			sf.IE7fix.call($ul);
+			o.onBeforeShow.call($ul);
+			$ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); });
+			return this;
+		}
+	});
+
+})(jQuery);
diff --git a/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/supersubs.js b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/supersubs.js
new file mode 100644
index 0000000..4522151
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/doc/ipojo-jmx-handler_files/supersubs.js
@@ -0,0 +1,90 @@
+
+/*
+ * Supersubs v0.2b - jQuery plugin
+ * Copyright (c) 2008 Joel Birch
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * 	http://www.opensource.org/licenses/mit-license.php
+ * 	http://www.gnu.org/licenses/gpl.html
+ *
+ *
+ * This plugin automatically adjusts submenu widths of suckerfish-style menus to that of
+ * their longest list item children. If you use this, please expect bugs and report them
+ * to the jQuery Google Group with the word 'Superfish' in the subject line.
+ *
+ */
+
+;(function($){ // $ will refer to jQuery within this closure
+
+	$.fn.supersubs = function(options){
+		var opts = $.extend({}, $.fn.supersubs.defaults, options);
+		// return original object to support chaining
+		return this.each(function() {
+			// cache selections
+			var $$ = $(this);
+			// support metadata
+			var o = $.meta ? $.extend({}, opts, $$.data()) : opts;
+			// get the font size of menu.
+			// .css('fontSize') returns various results cross-browser, so measure an em dash instead
+			var fontsize = $('<li id="menu-fontsize">&#8212;</li>').css({
+				'padding' : 0,
+				'position' : 'absolute',
+				'top' : '-999em',
+				'width' : 'auto'
+			}).appendTo($$).width(); //clientWidth is faster, but was incorrect here
+			// remove em dash
+			$('#menu-fontsize').remove();
+			// cache all ul elements
+			$ULs = $$.find('ul');
+			// loop through each ul in menu
+			$ULs.each(function(i) {	
+				// cache this ul
+				var $ul = $ULs.eq(i);
+				// get all (li) children of this ul
+				var $LIs = $ul.children();
+				// get all anchor grand-children
+				var $As = $LIs.children('a');
+				// force content to one line and save current float property
+				var liFloat = $LIs.css('white-space','nowrap').css('float');
+				// remove width restrictions and floats so elements remain vertically stacked
+				var emWidth = $ul.add($LIs).add($As).css({
+					'float' : 'none',
+					'width'	: 'auto'
+				})
+				// this ul will now be shrink-wrapped to longest li due to position:absolute
+				// so save its width as ems. Clientwidth is 2 times faster than .width() - thanks Dan Switzer
+				.end().end()[0].clientWidth / fontsize;
+				// add more width to ensure lines don't turn over at certain sizes in various browsers
+				emWidth += o.extraWidth;
+				// restrict to at least minWidth and at most maxWidth
+				if (emWidth > o.maxWidth)		{ emWidth = o.maxWidth; }
+				else if (emWidth < o.minWidth)	{ emWidth = o.minWidth; }
+				emWidth += 'em';
+				// set ul to width in ems
+				$ul.css('width',emWidth);
+				// restore li floats to avoid IE bugs
+				// set li width to full width of this ul
+				// revert white-space to normal
+				$LIs.css({
+					'float' : liFloat,
+					'width' : '100%',
+					'white-space' : 'normal'
+				})
+				// update offset position of descendant ul to reflect new width of parent
+				.each(function(){
+					var $childUl = $('>ul',this);
+					var offsetDirection = $childUl.css('left')!==undefined ? 'left' : 'right';
+					$childUl.css(offsetDirection,emWidth);
+				});
+			});
+			
+		});
+	};
+	// expose defaults
+	$.fn.supersubs.defaults = {
+		minWidth		: 9,		// requires em unit.
+		maxWidth		: 25,		// requires em unit.
+		extraWidth		: 0			// extra width can ensure lines don't sometimes turn over due to slight browser differences in how they round-off values
+	};
+	
+})(jQuery); // plugin code ends
diff --git a/ipojo/handler/jmx/jmx-handler/metadata.xml b/ipojo/handler/jmx/jmx-handler/metadata.xml
new file mode 100644
index 0000000..67b6b38
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/metadata.xml
@@ -0,0 +1,22 @@
+<!--
+	Licensed to the Apache Software Foundation (ASF) under one
+	or more contributor license agreements.  See the NOTICE file
+	distributed with this work for additional information
+	regarding copyright ownership.  The ASF licenses this file
+	to you under the Apache License, Version 2.0 (the
+	"License"); you may not use this file except in compliance
+	with the License.  You may obtain a copy of the License at
+	
+	http://www.apache.org/licenses/LICENSE-2.0
+	
+	Unless required by applicable law or agreed to in writing,
+	software distributed under the License is distributed on an
+	"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+	KIND, either express or implied.  See the License for the
+	specific language governing permissions and limitations
+	under the License.
+-->
+<ipojo>
+<handler classname="org.apache.felix.ipojo.handlers.jmx.MBeanHandler" name="config" namespace="org.apache.felix.ipojo.handlers.jmx" />
+<handler classname="org.apache.felix.ipojo.handlers.jmx.MBeanHandler" name="JMXBean" namespace="org.apache.felix.ipojo.handlers.jmx" />
+</ipojo>
\ No newline at end of file
diff --git a/ipojo/handler/jmx/jmx-handler/obr.xml b/ipojo/handler/jmx/jmx-handler/obr.xml
new file mode 100644
index 0000000..310c385
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/obr.xml
@@ -0,0 +1,30 @@
+<!--
+	Licensed to the Apache Software Foundation (ASF) under one
+	or more contributor license agreements.  See the NOTICE file
+	distributed with this work for additional information
+	regarding copyright ownership.  The ASF licenses this file
+	to you under the Apache License, Version 2.0 (the
+	"License"); you may not use this file except in compliance
+	with the License.  You may obtain a copy of the License at
+	
+	http://www.apache.org/licenses/LICENSE-2.0
+	
+	Unless required by applicable law or agreed to in writing,
+	software distributed under the License is distributed on an
+	"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+	KIND, either express or implied.  See the License for the
+	specific language governing permissions and limitations
+	under the License.
+-->
+<obr>
+	<capability name="ipojo.handler">
+		<p n="name" v="config"/>
+		<p n="namespace" v="org.apache.felix.ipojo.handlers.jmx"/>
+		<p n="type" v="primitive"/>
+	</capability>
+    <capability name="ipojo.handler">
+        <p n="name" v="JMXBean"/>
+        <p n="namespace" v="org.apache.felix.ipojo.handlers.jmx"/>
+        <p n="type" v="primitive"/>
+    </capability>
+</obr>
\ No newline at end of file
diff --git a/ipojo/handler/jmx/jmx-handler/pom.xml b/ipojo/handler/jmx/jmx-handler/pom.xml
new file mode 100644
index 0000000..67e8e07
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/pom.xml
@@ -0,0 +1,125 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <groupId>org.apache.felix</groupId>
+    <artifactId>felix-parent</artifactId>
+    <version>1.2.1</version>
+    <relativePath>../../pom/pom.xml</relativePath>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <packaging>bundle</packaging>
+  <name>Apache Felix iPOJO JMX Handler</name>
+  <artifactId>org.apache.felix.ipojo.handler.jmx</artifactId>
+  <version>1.5.0-SNAPSHOT</version>
+  
+  <description>
+  iPOJO extension to expose instances as MBean inside a MBean Server.
+  </description>
+  <url>http://felix.apache.org/site/ipojo-jmx-handler.html</url>
+  
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.ipojo</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.core</artifactId>
+      <version>4.0.0</version>
+    </dependency>
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <extensions>true</extensions>
+        <version>1.4.3</version>
+        <configuration>
+          <instructions>
+            <Private-Package> org.apache.felix.ipojo.handlers.jmx
+            </Private-Package>
+            <Bundle-Name>${project.name}</Bundle-Name>
+            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+            <Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
+            <Bundle-Description> iPOJO JMX Handler </Bundle-Description>
+            <Bundle-DocURL>
+              http://felix.apache.org/site/ipojo-jmx-handler.html
+            </Bundle-DocURL>
+            <Include-Resource> 
+              META-INF/LICENSE=LICENSE,
+              META-INF/NOTICE=NOTICE,
+              META-INF/DEPENDENCIES=DEPENDENCIES
+            </Include-Resource>
+          </instructions>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-ipojo-plugin</artifactId>
+        <version>${project.version}</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>ipojo-bundle</goal>
+            </goals>
+            <configuration>
+              <metadata>metadata.xml</metadata>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>rat-maven-plugin</artifactId>
+        <configuration>
+          <excludeSubProjects>false</excludeSubProjects>
+          <useEclipseDefaultExcludes>true</useEclipseDefaultExcludes>
+          <useMavenDefaultExcludes>true</useMavenDefaultExcludes>
+          <excludes>
+            <param>doc/**/*</param>
+            <param>maven-eclipse.xml</param>
+            <param>.checkstyle</param>
+            <param>.externalToolBuilders/*</param>
+            <param>LICENSE.asm</param>
+          </excludes>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-checkstyle-plugin</artifactId>
+        <configuration>
+          <enableRulesSummary>false</enableRulesSummary>
+          <violationSeverity>warning</violationSeverity>
+          <configLocation>http://felix.apache.org/ipojo/dev/checkstyle_ipojo.xml</configLocation>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/DynamicMBeanImpl.java b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/DynamicMBeanImpl.java
new file mode 100644
index 0000000..d2fe8f2
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/DynamicMBeanImpl.java
@@ -0,0 +1,408 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.handlers.jmx;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.management.Attribute;
+import javax.management.AttributeChangeNotification;
+import javax.management.AttributeList;
+import javax.management.AttributeNotFoundException;
+import javax.management.DynamicMBean;
+import javax.management.InvalidAttributeValueException;
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanException;
+import javax.management.MBeanInfo;
+import javax.management.MBeanNotificationInfo;
+import javax.management.MBeanOperationInfo;
+import javax.management.Notification;
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.ReflectionException;
+import javax.management.RuntimeOperationsException;
+
+import org.apache.felix.ipojo.InstanceManager;
+import org.apache.felix.ipojo.parser.MethodMetadata;
+import org.apache.felix.ipojo.util.Callback;
+import org.apache.felix.ipojo.util.Logger;
+
+/**
+ * This class implements iPOJO DynamicMBean. it builds the dynamic MBean
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class DynamicMBeanImpl extends NotificationBroadcasterSupport implements
+        DynamicMBean {
+
+    /**
+     * The instance manager. Used to store the InstanceManager instance.
+     */
+    protected final InstanceManager m_instanceManager;
+
+    /**
+     * The JmxConfigDFieldMap. Stors the data extracted from metadata.xml.
+     */
+    private JmxConfigFieldMap m_configMap;
+
+    /**
+     * The MBeanInfo. The class storing the MBean Informations.
+     */
+    private MBeanInfo m_mBeanInfo;
+
+    /**
+     * The class name. Constant storing the name of the class.
+     */
+    private String m_className = this.getClass().getName();
+
+    /**
+     * The sequence number. Used to calculate unique id to notification.
+     */
+    private int m_sequenceNumber;
+
+    /**
+     * Constructor.
+     *
+     * @param properties the data extracted from metadat.xml file
+     * @param instanceManager the InstanceManager instance
+     */
+    public DynamicMBeanImpl(JmxConfigFieldMap properties,
+            InstanceManager instanceManager) {
+        m_configMap = properties;
+        m_instanceManager = instanceManager;
+        this.buildMBeanInfo();
+    }
+
+    /**
+     * Gets the value of the required attribute.
+     *
+     * @param arg0 the name of required attribute
+     * @throws AttributeNotFoundException if the attribute doesn't exist
+     * @throws MBeanException if something bad occures
+     * @throws ReflectionException if something bad occures
+     * @return the object attribute
+     */
+    public Object getAttribute(String arg0) throws AttributeNotFoundException,
+        MBeanException, ReflectionException {
+        PropertyField attribute = m_configMap.getPropertyFromName(arg0);
+
+        if (attribute == null) {
+            throw new AttributeNotFoundException(arg0 + " not found");
+        } else {
+            return attribute.getValue();
+        }
+    }
+
+    /**
+     * Gets values of required attributes.
+     *
+     * @param attributeNames the names of the required attributes
+     * @return return the list of the attribute
+     */
+    public AttributeList getAttributes(String[] attributeNames) {
+
+        if (attributeNames == null) {
+            throw new IllegalArgumentException(
+                "attributeNames[] cannot be null");
+        }
+
+        AttributeList resultList = new AttributeList();
+        for (int i = 0; i < attributeNames.length; i++) {
+            PropertyField propertyField = (PropertyField) m_configMap
+                .getPropertyFromField((String) attributeNames[i]);
+
+            if (propertyField != null) {
+                resultList.add(new Attribute(attributeNames[i], propertyField
+                    .getValue()));
+            }
+        }
+        return resultList;
+    }
+
+    /**
+     * Returns the MBean Class builded.
+     *
+     * @return return MBeanInfo class constructed by buildMBeanInfo
+     */
+    public MBeanInfo getMBeanInfo() {
+        return m_mBeanInfo;
+    }
+
+    /**
+     * Invokes the required method on the targeted POJO.
+     *
+     * @param operationName the name of the method called
+     * @param params the parameters given to the method
+     * @param signature the determine which method called
+     * @return the object return by the method
+     * @throws MBeanException if something bad occures
+     * @throws ReflectionException if something bad occures
+     */
+    public Object invoke(String operationName, Object[] params,
+            String[] signature) throws MBeanException, ReflectionException {
+
+        MethodField method = m_configMap.getMethodFromName(operationName,
+            signature);
+        if (method != null) {
+            MethodMetadata methodCall = method.getMethod();
+            Callback mc = new Callback(methodCall, m_instanceManager);
+            try {
+                return mc.call(params);
+            } catch (NoSuchMethodException e) {
+                throw new ReflectionException(e);
+            } catch (IllegalAccessException e) {
+                throw new ReflectionException(e);
+            } catch (InvocationTargetException e) {
+                throw new MBeanException(e);
+            }
+        } else {
+            throw new ReflectionException(new NoSuchMethodException(
+                operationName), "Cannot find the operation " + operationName
+                    + " in " + m_className);
+        }
+    }
+
+    /**
+     * Changes specified attribute value.
+     *
+     * @param attribute the attribute with new value to be changed
+     * @throws AttributeNotFoundException if the required attribute was not found
+     * @throws InvalidAttributeValueException if the value is inccorrect type
+     * @throws MBeanException if something bad occures
+     * @throws ReflectionException if something bad occures
+     */
+    public void setAttribute(Attribute attribute)
+        throws AttributeNotFoundException, InvalidAttributeValueException,
+        MBeanException, ReflectionException {
+
+        // Check attribute is not null to avoid NullPointerException later on
+        if (attribute == null) {
+            throw new RuntimeOperationsException(new IllegalArgumentException(
+                "Attribute cannot be null"), "Cannot invoke a setter of "
+                    + m_className + " with null attribute");
+        }
+        String name = attribute.getName();
+        Object value = attribute.getValue();
+
+        if (name == null) {
+            throw new RuntimeOperationsException(new IllegalArgumentException(
+                "Attribute name cannot be null"),
+                "Cannot invoke the setter of " + m_className
+                        + " with null attribute name");
+        }
+        // Check for a recognized attribute name and call the corresponding
+        // setter
+        //
+
+        PropertyField propertyField = (PropertyField) m_configMap
+            .getPropertyFromName(name);
+        if (propertyField == null) {
+            // unrecognized attribute name:
+            throw new AttributeNotFoundException("Attribute " + name
+                    + " not found in " + m_className);
+        }
+        if (!propertyField.isWritable()) {
+            throw new InvalidAttributeValueException("Attribute " + name
+                    + " can not be set");
+        }
+
+        if (value == null) {
+            try {
+                m_instanceManager.onSet(null, propertyField.getField(), null);
+            } catch (Exception e) {
+                throw new InvalidAttributeValueException(
+                    "Cannot set attribute " + name + " to null");
+            }
+        } else { // if non null value, make sure it is assignable to the
+            // attribute
+//            if (true /* TODO type.class.isAssignableFrom(value.getClass()) */) {
+                // propertyField.setValue(value);
+                // setValue(attributeField.getField(),null);
+            m_instanceManager.onSet(null, propertyField.getField(), value);
+//            } else {
+//                throw new InvalidAttributeValueException(
+//                    "Cannot set attribute " + name + " to a "
+//                            + value.getClass().getName()
+//                            + " object, String expected");
+//            }
+        }
+
+    }
+
+    /**
+     * Changes all the attributes value.
+     *
+     * @param attributes the list of attribute value to be changed
+     * @return the list of new attribute
+     */
+    public AttributeList setAttributes(AttributeList attributes) {
+
+        // Check attributes is not null to avoid NullPointerException later on
+        if (attributes == null) {
+            throw new RuntimeOperationsException(new IllegalArgumentException(
+                "AttributeList attributes cannot be null"),
+                "Cannot invoke a setter of " + m_className);
+        }
+        AttributeList resultList = new AttributeList();
+
+        // if attributeNames is empty, nothing more to do
+        if (attributes.isEmpty()) {
+            return resultList;
+        }
+
+        // for each attribute, try to set it and add to the result list if
+        // successful
+        for (Iterator i = attributes.iterator(); i.hasNext();) {
+            Attribute attr = (Attribute) i.next();
+            try {
+                setAttribute(attr);
+                String name = attr.getName();
+                Object value = getAttribute(name);
+                resultList.add(new Attribute(name, value));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return resultList;
+    }
+
+    /**
+     * Builds the MBean information on initialization. This
+     * value doesn't change further.
+     */
+    private void buildMBeanInfo() {
+
+        // generate infos for attributes
+        MBeanAttributeInfo[] dAttributes = null;
+
+        if (m_configMap == null) {
+            return;
+        }
+
+        String dDescription = m_configMap.getDecription();
+
+        if (m_configMap.getProperties() != null) {
+            List < MBeanAttributeInfo > lAttributes = null;
+            lAttributes = new ArrayList < MBeanAttributeInfo >();
+
+            Iterator < PropertyField > iterator = m_configMap.getProperties()
+                .iterator();
+            while (iterator.hasNext()) {
+                PropertyField propertyField = iterator.next();
+                lAttributes.add(new MBeanAttributeInfo(propertyField.getName(),
+                    propertyField.getType(), propertyField.getDescription(),
+                    propertyField.isReadable(), propertyField.isWritable(),
+                    false));
+            }
+            dAttributes = lAttributes
+                .toArray(new MBeanAttributeInfo[lAttributes.size()]);
+        }
+
+        MBeanOperationInfo[] dOperations = null;
+        if (m_configMap.getMethods() != null) {
+
+            List < MBeanOperationInfo > lOperations = new ArrayList < MBeanOperationInfo >();
+
+            Iterator < MethodField[] > iterator = m_configMap.getMethods()
+                .iterator();
+            while (iterator.hasNext()) {
+                MethodField[] method = iterator.next();
+                for (int i = 0; i < method.length; i++) {
+                    lOperations.add(new MBeanOperationInfo(method[i].getName(),
+                        method[i].getDescription(), method[i].getParams(),
+                        method[i].getReturnType(), MBeanOperationInfo.UNKNOWN));
+                }
+                dOperations = lOperations
+                    .toArray(new MBeanOperationInfo[lOperations.size()]);
+            }
+        }
+
+        MBeanNotificationInfo[] dNotification = new MBeanNotificationInfo[0];
+        if (m_configMap.getMethods() != null) {
+
+            List < MBeanNotificationInfo > lNotifications = new ArrayList < MBeanNotificationInfo >();
+
+            Iterator < NotificationField > iterator = m_configMap
+                .getNotifications().iterator();
+            while (iterator.hasNext()) {
+                NotificationField notification = iterator
+                    .next();
+                lNotifications.add(notification.getNotificationInfo());
+            }
+            dNotification = lNotifications
+                .toArray(new MBeanNotificationInfo[lNotifications.size()]);
+        }
+
+        m_mBeanInfo = new MBeanInfo(this.m_className, dDescription,
+            dAttributes, null, // No constructor
+            dOperations, dNotification);
+    }
+
+    /**
+     * Gets the notification informations (use by JMX).
+     *
+     * @return the structure which describe the notifications
+     */
+    public MBeanNotificationInfo[] getNotificationInfo() {
+        MBeanNotificationInfo[] dNotification = new MBeanNotificationInfo[0];
+        if (m_configMap.getMethods() != null) {
+
+            List < MBeanNotificationInfo > lNotifications = new ArrayList < MBeanNotificationInfo >();
+
+            Iterator < NotificationField > iterator = m_configMap
+                .getNotifications().iterator();
+            while (iterator.hasNext()) {
+                NotificationField notification = iterator
+                    .next();
+                lNotifications.add(notification.getNotificationInfo());
+            }
+            dNotification = lNotifications
+                .toArray(new MBeanNotificationInfo[lNotifications.size()]);
+        }
+        return dNotification;
+    }
+
+    /**
+     * Sends a notification to a subscriber.
+     *
+     * @param msg the msg to send
+     * @param attributeName the name of the attribute
+     * @param attributeType the type of the attribute
+     * @param oldValue the old value of the attribute
+     * @param newValue the new value of the attribute
+     */
+    public void sendNotification(String msg, String attributeName,
+            String attributeType, Object oldValue, Object newValue) {
+
+        long timeStamp = System.currentTimeMillis();
+
+        if ((newValue == null  && oldValue == null)
+        		|| (newValue != null  && newValue.equals(oldValue))) {
+            return;
+        }
+        m_sequenceNumber++;
+        Notification notification = new AttributeChangeNotification(this,
+            m_sequenceNumber, timeStamp, msg, attributeName, attributeType,
+            oldValue, newValue);
+        sendNotification(notification);
+        m_instanceManager.getFactory().getLogger().log(Logger.INFO,
+            "Notification sent");
+    }
+}
diff --git a/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/DynamicMBeanWRegisterImpl.java b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/DynamicMBeanWRegisterImpl.java
new file mode 100644
index 0000000..c3c9dd3
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/DynamicMBeanWRegisterImpl.java
@@ -0,0 +1,165 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.handlers.jmx;
+
+import java.lang.reflect.InvocationTargetException;
+
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.apache.felix.ipojo.InstanceManager;
+import org.apache.felix.ipojo.parser.MethodMetadata;
+import org.apache.felix.ipojo.util.Callback;
+
+/**
+ * This class implements a 'wide' iPOJO DynamicMBean that can perform actions
+ * before and after its registration and deregistration.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class DynamicMBeanWRegisterImpl extends DynamicMBeanImpl implements
+        MBeanRegistration {
+
+    /**
+     * The preRegister method of MBeanRegistration interface.
+     */
+    private MethodMetadata m_preRegisterMeth;
+    /**
+     * The postRegister method of MBeanRegistration interface.
+     */
+    private MethodMetadata m_postRegisterMeth;
+    /**
+     * The preDeregister method of MBeanRegistration interface.
+     */
+    private MethodMetadata m_preDeregisterMeth;
+    /**
+     * The postDeregister method of MBeanRegistration interface.
+     */
+    private MethodMetadata m_postDeregisterMeth;
+    /**
+     * The effective name of the MBean.
+     */
+    private ObjectName m_objName;
+
+    /**
+     * Constructs a new DynamicMBeanWRegisterImpl.
+     * 
+     * @param properties the data extracted from the metadata.xml
+     * @param instanceManager the instance manager
+     * @param preRegisterMeth the method to call before MBean registration
+     * @param postRegisterMeth the method to call after MBean registration
+     * @param preDeregisterMeth the method to call before MBean deregistration
+     * @param postDeregisterMeth the method to call after MBean registration
+     */
+    public DynamicMBeanWRegisterImpl(JmxConfigFieldMap properties,
+            InstanceManager instanceManager, MethodMetadata preRegisterMeth,
+            MethodMetadata postRegisterMeth, MethodMetadata preDeregisterMeth,
+            MethodMetadata postDeregisterMeth) {
+        super(properties, instanceManager);
+
+        m_preRegisterMeth = preRegisterMeth;
+        m_postRegisterMeth = postRegisterMeth;
+        m_preDeregisterMeth = preDeregisterMeth;
+        m_postDeregisterMeth = postDeregisterMeth;
+    }
+
+    /**
+     * Returns the MBean name used to register it.
+     * 
+     * @return the MBean name used to register it.
+     */
+    public ObjectName getObjectName() {
+        return m_objName;
+    }
+
+    /**
+     * This method is executed before the MBean registration.
+     * 
+     * @param server the server on which the MBean will be registered
+     * @param name the name of the MBean to expose
+     * @throws Exception This exception will be caught by the MBean server and re-thrown as an MBeanRegistrationException.
+     * @return the name with which the MBean will be registered
+     */
+    public ObjectName preRegister(MBeanServer server, ObjectName name)
+        throws Exception {
+        m_objName = (ObjectName) callMethod(m_preRegisterMeth,
+            MBeanHandler.PRE_REGISTER_METH_NAME, new Object[] { server, name });
+        return m_objName;
+    }
+
+    /**
+     * This method is executed after the MBean registration.
+     * 
+     * @param registrationDone indicates whether or not the MBean has been successfully registered in the MBean server.
+     */
+    public void postRegister(Boolean registrationDone) {
+        callMethod(m_postRegisterMeth, MBeanHandler.POST_REGISTER_METH_NAME,
+            new Object[] { registrationDone });
+    }
+
+    /**
+     * This method is before after the MBean deregistration.
+     * 
+     * @throws Exception This exception will be caught by the MBean server and re-thrown as an MBeanRegistrationException.
+     */
+    public void preDeregister() throws Exception {
+        callMethod(m_preDeregisterMeth, MBeanHandler.PRE_DEREGISTER_METH_NAME,
+            null);
+    }
+
+    /**
+     * This method is executed after the MBean deregistration.
+     */
+    public void postDeregister() {
+        callMethod(m_postDeregisterMeth,
+            MBeanHandler.POST_DEREGISTER_METH_NAME, null);
+    }
+
+    /**
+     * Private method used to execute a given callback.
+     * 
+     * @param methodMetadata  the metadata description of the callback
+     * @param methodName the name of the callback
+     * @param params the parameters of the callback
+     * @return the object eventually returned by the callback, or null if nothing's returned
+     */
+    private Object callMethod(MethodMetadata methodMetadata, String methodName,
+            Object[] params) {
+        Callback mc = new Callback(methodMetadata, m_instanceManager);
+        try {
+            if ((params == null) || (params.length == 0)) {
+                return mc.call();
+            } else {
+                return mc.call(params);
+            }
+        } catch (NoSuchMethodException e) {
+            // should never happen : method exists
+            System.err.println("No such method : " + methodName);
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            System.err.println("Illegal Access Exception");
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            System.err.println("Invocation Target Exception");
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
diff --git a/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/JMXHandlerDescription.java b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/JMXHandlerDescription.java
new file mode 100644
index 0000000..a5b1955
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/JMXHandlerDescription.java
@@ -0,0 +1,71 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.handlers.jmx;
+
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+
+/**
+ * Description of the JMX handler.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class JMXHandlerDescription extends HandlerDescription {
+
+    /**
+     * The referenced handler.
+     */
+    private MBeanHandler m_handler;
+
+    /**
+     * Constructs a new handler description for the given handler.
+     * 
+     * @param handler the handler to describe
+     */
+    public JMXHandlerDescription(MBeanHandler handler) {
+        super(handler);
+        m_handler = handler;
+    }
+
+    /**
+     * Gets handler information.
+     * 
+     * @return the handler information.
+     */
+    public Element getHandlerInfo() {
+        Element elem = super.getHandlerInfo();
+        elem.addAttribute(new Attribute("registered", Boolean
+            .toString(m_handler.isRegistered())));
+        elem.addAttribute(new Attribute("objectName", m_handler
+            .getUsedObjectName()));
+        if (m_handler.isUsesMOSGi()) {
+            String foundStr = null;
+
+            if (m_handler.isMOSGiExists()) {
+                foundStr = "found";
+            } else {
+                foundStr = "not_found";
+            }
+            elem.addAttribute(new Attribute("mosgi", foundStr));
+        }
+
+        return elem;
+    }
+}
diff --git a/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/JmxConfigFieldMap.java b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/JmxConfigFieldMap.java
new file mode 100644
index 0000000..56f436a
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/JmxConfigFieldMap.java
@@ -0,0 +1,297 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.handlers.jmx;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * JmxConfigFieldMap : use to store the informations needed to build the Dynamic
+ * MBean.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class JmxConfigFieldMap {
+
+    /**
+     * The exposed attributes.
+     */
+    private Map < String, PropertyField > m_properties = new HashMap < String, PropertyField >();
+    /**
+     * The exposed methods.
+     */
+    private Map < String, MethodField[] > m_methods = new HashMap < String, MethodField[] >();
+    /**
+     * The allowed notifications.
+     */
+    private Map < String, NotificationField > m_notifications = new HashMap < String, NotificationField >();
+    /**
+     * The description of the Mbean.
+     */
+    private String m_description;
+
+    /**
+     * Constructor.
+     */
+    public JmxConfigFieldMap() {
+
+    }
+
+    /**
+     * Gets the description of the MBean.
+     * 
+     * @return the description of the MBean
+     */
+    public String getDecription() {
+        return m_description;
+    }
+
+    /**
+     * Sets the description of the MBean.
+     * 
+     * @param description a String which describes the Mbean
+     */
+    public void setDescription(String description) {
+        this.m_description = description;
+    }
+
+    /**
+     * Adds a new attribute exposed in the Mbean.
+     * 
+     * @param name the name of the new property
+     * @param propertyField the field which describes the property
+     */
+    public void addPropertyFromName(String name, PropertyField propertyField) {
+        m_properties.put(name, propertyField);
+    }
+
+    /**
+     * Gets all of the properties exposed.
+     * 
+     * @return the collection of all properties
+     */
+    public Collection < PropertyField > getProperties() {
+        if (m_properties != null) {
+            return m_properties.values();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Gets the property by the name.
+     * 
+     * @param name the name of the required property
+     * @return the field required or null if is not found
+     */
+    public PropertyField getPropertyFromName(String name) {
+        PropertyField prop = m_properties.get(name);
+        return prop;
+    }
+
+    /**
+     * Gets the property by the field.
+     * 
+     * @param field the required field
+     * @return the property by the field
+     */
+    public PropertyField getPropertyFromField(String field) {
+        PropertyField property = null;
+        Iterator < PropertyField > it = m_properties.values().iterator();
+        while (it.hasNext()) {
+            PropertyField p = it.next();
+            if (p.getField().compareTo(field) == 0) {
+                if (property != null) {
+                    System.err.println("a field already exists");
+                } else {
+                    property = p;
+                }
+            }
+        }
+        return property;
+    }
+
+    /**
+     * Adds a new method descriptor from its name.
+     * 
+     * @param name the name of the method
+     * @param methodField the description of the method
+     */
+    public void addMethodFromName(String name, MethodField methodField) {
+        MethodField[] mf;
+        if (!m_methods.containsKey(name)) {
+            mf = new MethodField[1];
+            mf[0] = methodField;
+        } else {
+            MethodField[] temp = m_methods.get(name);
+            mf = new MethodField[temp.length + 1];
+            for (int i = 0; i < temp.length; i++) {
+                mf[i] = temp[i];
+            }
+            mf[temp.length] = methodField;
+        }
+        m_methods.put(name, mf);
+    }
+
+    /**
+     * Adds new methods descriptors from one name. (the method must have the same name but different signature).
+     * 
+     * @param name the name of the method
+     * @param methodsField the description of the methods
+     */
+    public void addMethodFromName(String name, MethodField[] methodsField) {
+        MethodField[] mf;
+        if (!m_methods.containsKey(name)) {
+            mf = methodsField;
+        } else {
+            MethodField[] temp = m_methods.get(name);
+            mf = new MethodField[temp.length + methodsField.length];
+            for (int i = 0; i < temp.length; i++) {
+                mf[i] = temp[i];
+            }
+            for (int i = 0; i < methodsField.length; i++) {
+                mf[i + temp.length] = methodsField[i];
+            }
+        }
+        m_methods.put(name, mf);
+    }
+
+    /**
+     * Adds a method from name and erases the older if exists.
+     * 
+     * @param name the name of the method
+     * @param methodField the method to be added
+     */
+    public void overrideMethodFromName(String name, MethodField methodField) {
+        MethodField[] mf = new MethodField[1];
+        mf[0] = methodField;
+        m_methods.put(name, mf);
+    }
+
+    /**
+     * Add methods from name and erases the olders if exists.
+     * 
+     * @param name the name of the method
+     * @param methodsField the array of methods to be added
+     */
+    public void overrideMethodFromName(String name, MethodField[] methodsField) {
+        m_methods.put(name, methodsField);
+    }
+
+    /**
+     * Returns the method(s) with the given name.
+     * 
+     * @param name the name of the methods
+     * @return the list of methods with the given name
+     */
+    public MethodField[] getMethodFromName(String name) {
+        MethodField[] prop = m_methods.get(name);
+        return prop;
+    }
+
+    /**
+     * Gets the method with the good signature.
+     * 
+     * @param operationName the name of the method requiered
+     * @param signature the required signature
+     * @return the method which the same signature or null if not found
+     */
+    public MethodField getMethodFromName(String operationName,
+            String[] signature) {
+        MethodField[] methods = m_methods.get(operationName);
+        for (int i = 0; i < methods.length; i++) {
+            if (isSameSignature(signature, methods[i].getSignature())) {
+                return methods[i];
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Compares two method signature.
+     * 
+     * @param sig1 the first signature
+     * @param sig2 the second signature
+     * @return true if the signature are similar false otherwise
+     */
+    private boolean isSameSignature(String[] sig1, String[] sig2) {
+        if (sig1.length != sig2.length) {
+            return false;
+        } else {
+            for (int i = 0; i < sig1.length; i++) {
+                if (!sig1[i].equals(sig2[i])) {
+                    return false;
+                }
+            }
+
+        }
+        return true;
+    }
+
+    /**
+     * Returns all methods store.
+     * 
+     * @return the collection of methodField[]
+     */
+    public Collection < MethodField[] > getMethods() {
+        if (m_methods != null) {
+            return m_methods.values();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Adds a notification.
+     * 
+     * @param name the name of the notification
+     * @param notificationField the field involved with the notification.
+     */
+    public void addNotificationFromName(String name,
+            NotificationField notificationField) {
+        m_notifications.put(name, notificationField);
+    }
+
+    /**
+     * Returns the notification with the given name.
+     * 
+     * @param name the name of the notification to return
+     * @return the notification if it exists, {@code null} otherwise
+     */
+    public NotificationField getNotificationFromName(String name) {
+        NotificationField prop = m_notifications.get(name);
+        return prop;
+    }
+
+    /**
+     * Gets all notifications defined.
+     * 
+     * @return the collection of NotificationField
+     */
+    public Collection < NotificationField > getNotifications() {
+        if (m_notifications != null) {
+            return m_notifications.values();
+        } else {
+            return null;
+        }
+    }
+}
diff --git a/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/MBeanHandler.java b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/MBeanHandler.java
new file mode 100644
index 0000000..9bbd354
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/MBeanHandler.java
@@ -0,0 +1,668 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.handlers.jmx;
+
+import java.lang.management.ManagementFactory;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Dictionary;
+import java.util.List;
+import java.util.Properties;
+
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+
+import org.apache.felix.ipojo.FieldInterceptor;
+import org.apache.felix.ipojo.InstanceManager;
+import org.apache.felix.ipojo.PrimitiveHandler;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.FieldMetadata;
+import org.apache.felix.ipojo.parser.MethodMetadata;
+import org.apache.felix.ipojo.parser.PojoMetadata;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * This class implements iPOJO Handler. it builds the dynamic MBean from
+ * metadata.xml and exposes it to the MBean Server.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class MBeanHandler extends PrimitiveHandler {
+
+    /**
+     * The name of the MBeanRegistration postDeregister method.
+     */
+    public static final String POST_DEREGISTER_METH_NAME = "postDeregister";
+
+    /**
+     * The name of the MBeanRegistration preDeregister method.
+     */
+    public static final String PRE_DEREGISTER_METH_NAME = "preDeregister";
+
+    /**
+     * The name of the MBeanRegistration postRegister method.
+     */
+    public static final String POST_REGISTER_METH_NAME = "postRegister";
+
+    /**
+     * The name of the MBeanRegistration preRegister method.
+     */
+    public static final String PRE_REGISTER_METH_NAME = "preRegister";
+
+    /**
+     * The name of the global configuration element.
+     */
+    private static final String JMX_CONFIG_ELT = "config";
+
+    /**
+     * The name of the global configuration element.
+     */
+    private static final String JMX_CONFIG_ALT_ELT = "JmxBean";
+
+    /**
+     * The name of the component object full name attribute.
+     */
+    private static final String JMX_OBJ_NAME_ELT = "objectName";
+
+    /**
+     * The name of the component object name domain attribute.
+     */
+    private static final String JMX_OBJ_NAME_DOMAIN_ELT = "domain";
+
+    /**
+     * The name of the component object name attribute.
+     */
+    private static final String JMX_OBJ_NAME_WO_DOMAIN_ELT = "name";
+
+    /**
+     * The name of the attribute indicating if the handler uses MOSGi MBean server.
+     */
+    private static final String JMX_USES_MOSGI_ELT = "usesMOSGi";
+
+    /**
+     * The name of a method element.
+     */
+    private static final String JMX_METHOD_ELT = "method";
+
+    /**
+     * The alternative name of a method element.
+     */
+    private static final String JMX_METHOD_ELT_ALT = "JmxMethod";
+
+    /**
+     * The name of the property or method name attribute.
+     */
+    private static final String JMX_NAME_ELT = "name";
+
+    /**
+     * The name of a method description attribute.
+     */
+    private static final String JMX_DESCRIPTION_ELT = "description";
+
+    /**
+     * The name of a property element.
+     */
+    private static final String JMX_PROPERTY_ELT = "property";
+
+    /**
+     * The alternative name of a property element.
+     */
+    private static final String JMX_PROPERTY_ELT_ALT = "JmxProperty";
+
+    /**
+     * The name of the field attribute.
+     */
+    private static final String JMX_FIELD_ELT = "field";
+
+    /**
+     * The name of the notification attribute.
+     */
+    private static final String JMX_NOTIFICATION_ELT = "notification";
+
+    /**
+     * The name of the rights attribute.
+     */
+    private static final String JMX_RIGHTS_ELT = "rights";
+
+    /**
+     * The instance manager. Used to store the InstanceManager instance.
+     */
+    private InstanceManager m_instanceManager;
+    /**
+     * The service registration. Used to register and unregister the Dynamic MBean.
+     */
+    private ServiceRegistration m_serviceRegistration;
+    /**
+     * Stores data when parsing metadata.xml.
+     */
+    private JmxConfigFieldMap m_jmxConfigFieldMap;
+    /**
+     * Stores the Dynamic MBean.
+     */
+    private DynamicMBeanImpl m_MBean;
+    /**
+     * Constant storing the name of the class.
+     */
+    private String m_namespace = "org.apache.felix.ipojo.handlers.jmx";
+    /**
+     * The flag used to inform if we use the MOSGi framework.
+     */
+    private boolean m_usesMOSGi;
+    /**
+     * The ObjectName used to register the MBean.
+     */
+    private ObjectName m_objectName;
+    /**
+     * The flag used to inform if the MBean is registered.
+     */
+    private boolean m_registered;
+    /**
+     * The ObjectName specified in handler configuration. It can be null.
+     */
+    private String m_completeObjNameElt;
+    /**
+     * The ObjectName without domain specified in handler configuration. It can be null.
+     */
+    private String m_objNameWODomainElt;
+
+    /**
+     * The ObjectName domain specified in handler configuration. It can be null.
+     */
+    private String m_domainElt;
+    /**
+     * The flag informing if the POJO implements the MBeanRegistration interface.
+     */
+    private boolean m_registerCallbacks;
+    /**
+     * The preRegister method of MBeanRegistration interface. It is null if POJO doesn't implement MBeanRegistration interface.
+     */
+    private MethodMetadata m_preRegisterMeth;
+    /**
+     * The postRegister method of MBeanRegistration interface. It is null if POJO doesn't implement MBeanRegistration interface.
+     */
+    private MethodMetadata m_postRegisterMeth;
+    /**
+     * The preDeregister method of MBeanRegistration interface. It is null if POJO doesn't implement MBeanRegistration interface.
+     */
+    private MethodMetadata m_preDeregisterMeth;
+    /**
+     * The postDeregister method of MBeanRegistration interface. It is null if POJO doesn't implement MBeanRegistration interface.
+     */
+    private MethodMetadata m_postDeregisterMeth;
+
+    /**
+     * Constructs the structure JmxConfigFieldMap and the Dynamic Mbean.
+     *
+     * @param metadata the component metadata
+     * @param dict the instance configuration
+     */
+    public void configure(Element metadata, Dictionary dict) {
+
+        PojoMetadata manipulation = getPojoMetadata();
+
+        m_instanceManager = getInstanceManager();
+
+        m_jmxConfigFieldMap = new JmxConfigFieldMap();
+
+        // Build the hashmap
+        Element[] mbeans = metadata.getElements(JMX_CONFIG_ELT, m_namespace);
+        if (mbeans == null || mbeans.length == 0) {
+            mbeans = metadata.getElements(JMX_CONFIG_ALT_ELT, m_namespace);
+        }
+
+        if (mbeans.length != 1) {
+            error("A component must have exactly one " + JMX_CONFIG_ELT + " or " + JMX_CONFIG_ALT_ELT + " element.");
+            error("The JMX handler configuration is ignored.");
+            return;
+        }
+
+        Element mbean = mbeans[0];
+
+        // retrieve kind of MBeanServer to use
+        m_usesMOSGi = Boolean.parseBoolean(mbean.getAttribute(JMX_USES_MOSGI_ELT));
+
+        // retrieve object name
+        m_completeObjNameElt = mbean.getAttribute(JMX_OBJ_NAME_ELT);
+        m_domainElt = mbean.getAttribute(JMX_OBJ_NAME_DOMAIN_ELT);
+        m_objNameWODomainElt = mbean.getAttribute(JMX_OBJ_NAME_WO_DOMAIN_ELT);
+
+        // test if Pojo is interested in registration callbacks
+        m_registerCallbacks = manipulation
+            .isInterfaceImplemented(MBeanRegistration.class.getName());
+        if (m_registerCallbacks) {
+            // don't need to check that methods exist, the pojo implements
+            // MBeanRegistration interface
+            String[] preRegisterParams = { MBeanServer.class.getName(),
+                    ObjectName.class.getName() };
+            m_preRegisterMeth = manipulation.getMethod(PRE_REGISTER_METH_NAME,
+                preRegisterParams);
+
+            String[] postRegisterParams = { Boolean.class.getName() };
+            m_postRegisterMeth = manipulation.getMethod(
+                POST_REGISTER_METH_NAME, postRegisterParams);
+
+            m_preDeregisterMeth = manipulation.getMethod(
+                PRE_DEREGISTER_METH_NAME, new String[0]);
+
+            m_postDeregisterMeth = manipulation.getMethod(
+                POST_DEREGISTER_METH_NAME, new String[0]);
+        }
+
+        // set property
+        Element[] attributes = mbean.getElements(JMX_PROPERTY_ELT, m_namespace);
+        Element[] attributesAlt = mbean.getElements(JMX_PROPERTY_ELT_ALT, m_namespace);
+        List<Element> listOfAttributes = new ArrayList<Element>();
+        if (attributes != null) {
+        	listOfAttributes.addAll(Arrays.asList(attributes));
+        }
+        if (attributesAlt != null) {
+        	listOfAttributes.addAll(Arrays.asList(attributesAlt));
+        }
+
+        Element[] attributesOld = mbeans[0].getElements(JMX_PROPERTY_ELT);
+        if (attributesOld != null) {
+            warn("The JMX property element should use the '" + m_namespace + "' namespace.");
+            listOfAttributes.addAll(Arrays.asList(attributesOld));
+        }
+
+        for (Element attribute : listOfAttributes) {
+            boolean notif = false;
+            String rights;
+            String name;
+            String field = attribute.getAttribute(JMX_FIELD_ELT);
+
+            if (attribute.containsAttribute(JMX_NAME_ELT)) {
+                name = attribute.getAttribute(JMX_NAME_ELT);
+            } else {
+                name = field;
+            }
+            if (attribute.containsAttribute(JMX_RIGHTS_ELT)) {
+                rights = attribute.getAttribute(JMX_RIGHTS_ELT);
+            } else {
+                rights = "r";
+            }
+
+            PropertyField property = new PropertyField(name, field, rights,
+                getTypeFromAttributeField(field, manipulation));
+
+            if (attribute.containsAttribute(JMX_NOTIFICATION_ELT)) {
+                notif = Boolean.parseBoolean(attribute
+                    .getAttribute(JMX_NOTIFICATION_ELT));
+            }
+
+            property.setNotifiable(notif);
+
+            if (notif) {
+                // add the new notifiable property in structure
+                NotificationField notification = new NotificationField(
+                    name, this.getClass().getName() + "." + field, null);
+                m_jmxConfigFieldMap.addNotificationFromName(name,
+                    notification);
+            }
+            m_jmxConfigFieldMap.addPropertyFromName(name, property);
+            getInstanceManager().register(manipulation.getField(field),
+                this);
+            info("property exposed:" + name + " " + field + ":"
+                    + getTypeFromAttributeField(field, manipulation) + " "
+                    + rights + ", Notif=" + notif);
+        }
+
+        // set methods
+        Element[] methods = mbean.getElements(JMX_METHOD_ELT, m_namespace);
+        Element[] methodsAlt = mbean.getElements(JMX_METHOD_ELT_ALT, m_namespace);
+        List<Element> listOfMethods = new ArrayList<Element>();
+        if (methods != null) {
+        	listOfMethods.addAll(Arrays.asList(methods));
+        }
+        if (methodsAlt != null) {
+        	listOfMethods.addAll(Arrays.asList(methodsAlt));
+        }
+
+        Element[] methodsOld = mbeans[0].getElements(JMX_PROPERTY_ELT);
+        if (methodsOld != null) {
+            warn("The JMX method element should use the '" + m_namespace + "' namespace.");
+            listOfMethods.addAll(Arrays.asList(methodsOld));
+        }
+
+        for (Element method : listOfMethods) {
+            String name = method.getAttribute(JMX_NAME_ELT);
+            if (name == null) {
+                name = method.getAttribute("method");
+            }
+            String description = null;
+            if (method.containsAttribute(JMX_DESCRIPTION_ELT)) {
+                description = method.getAttribute(JMX_DESCRIPTION_ELT);
+            }
+
+            MethodField[] meth = getMethodsFromName(name, manipulation,
+                description);
+
+            for (int j = 0; j < meth.length; j++) {
+                m_jmxConfigFieldMap.addMethodFromName(name, meth[j]);
+
+                info("method exposed:" + meth[j].getReturnType() + " " + name);
+            }
+        }
+
+    }
+
+    /**
+     * Registers the Dynamic Mbean.
+     */
+    public void start() {
+        // create the corresponding MBean
+        if (m_registerCallbacks) {
+            m_MBean = new DynamicMBeanWRegisterImpl(m_jmxConfigFieldMap,
+                m_instanceManager, m_preRegisterMeth, m_postRegisterMeth,
+                m_preDeregisterMeth, m_postDeregisterMeth);
+        } else {
+            m_MBean = new DynamicMBeanImpl(m_jmxConfigFieldMap,
+                m_instanceManager);
+        }
+
+        if (m_usesMOSGi) {
+            // use whiteboard pattern to register MBean
+
+            if (m_serviceRegistration != null) {
+                m_serviceRegistration.unregister();
+            }
+
+            // Register the ManagedService
+            BundleContext bundleContext = m_instanceManager.getContext();
+            Properties properties = new Properties();
+            try {
+                m_objectName = new ObjectName(getObjectNameString());
+
+                properties.put("jmxagent.objectName", m_objectName.toString());
+
+                m_serviceRegistration = bundleContext.registerService(
+                    javax.management.DynamicMBean.class.getName(), m_MBean,
+                    properties);
+
+                m_registered = true;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        } else {
+            try {
+                m_objectName = new ObjectName(getObjectNameString());
+                ObjectInstance instance = ManagementFactory
+                    .getPlatformMBeanServer().registerMBean(m_MBean,
+                        m_objectName);
+
+                // we must retrieve object name used to register the MBean.
+                // It can have been changed by preRegister method of
+                // MBeanRegistration interface.
+                if (m_registerCallbacks) {
+                    m_objectName = instance.getObjectName();
+                }
+
+                m_registered = true;
+            } catch (Exception e) {
+                error("Registration of MBean failed.", e);
+            }
+        }
+    }
+
+    /**
+     * Returns the object name of the exposed component.
+     *
+     * @return the object name of the exposed component.
+     */
+    private String getObjectNameString() {
+        if (m_completeObjNameElt != null) {
+            return m_completeObjNameElt;
+        }
+
+        String domain;
+        if (m_domainElt != null) {
+            domain = m_domainElt;
+        } else {
+            domain = getPackageName(m_instanceManager.getClassName());
+        }
+
+        String name = "type=" + m_instanceManager.getClassName() + ",instance="
+                + m_instanceManager.getInstanceName();
+        if (m_objNameWODomainElt != null) {
+            name = "name=" + m_objNameWODomainElt;
+        }
+
+        StringBuffer sb = new StringBuffer();
+        if ((domain != null) && (domain.length() > 0)) {
+            sb.append(domain + ":");
+        }
+        sb.append(name);
+
+        info("Computed Objectname: " + sb.toString());
+
+        return sb.toString();
+    }
+
+    /**
+     * Extracts the package name from of given type.
+     *
+     * @param className the type name.
+     * @return the package name of the given type.
+     */
+    private String getPackageName(String className) {
+        String packageName = "";
+
+        int plotIdx = className.lastIndexOf(".");
+        if (plotIdx != -1) {
+            packageName = className.substring(0, plotIdx);
+        }
+
+        return packageName;
+    }
+
+    /**
+     * Unregisters the Dynamic Mbean.
+     */
+    public void stop() {
+        if (m_usesMOSGi) {
+            if (m_serviceRegistration != null) {
+                m_serviceRegistration.unregister();
+            }
+        } else {
+            if (m_objectName != null) {
+                try {
+                    ManagementFactory.getPlatformMBeanServer().unregisterMBean(
+                        m_objectName);
+                } catch (Exception e) {
+                    error("Unregistration of MBean failed.", e);
+                }
+                m_objectName = null;
+            }
+        }
+
+        m_MBean = null;
+        m_registered = false;
+    }
+
+    /**
+     * Called when a POJO member is modified externally.
+     *
+     * @param pojo the modified POJO object
+     * @param fieldName the name of the modified field
+     * @param value the new value of the field
+     * @see FieldInterceptor#onSet(Object, String, Object)
+     */
+    public void onSet(Object pojo, String fieldName, Object value) {
+        // Check if the field is a configurable property
+
+        PropertyField propertyField = (PropertyField) m_jmxConfigFieldMap
+            .getPropertyFromField(fieldName);
+        if (propertyField != null) {
+            if (propertyField.isNotifiable()) {
+                // TODO should send notif only when value has changed to a value
+                // different than the last one.
+                m_MBean.sendNotification(propertyField.getName() + " changed",
+                    propertyField.getName(), propertyField.getType(),
+                    propertyField.getValue(), value);
+            }
+            propertyField.setValue(value);
+        }
+    }
+
+    /**
+     * Called when a POJO member is read by the MBean.
+     *
+     * @param pojo the read POJO object.
+     * @param fieldName the name of the modified field
+     * @param value the old value of the field
+     * @return the (injected) value of the field
+     * @see FieldInterceptor#onGet(Object, String, Object)
+     */
+    public Object onGet(Object pojo, String fieldName, Object value) {
+
+        // Check if the field is a configurable property
+        PropertyField propertyField = (PropertyField) m_jmxConfigFieldMap
+            .getPropertyFromField(fieldName);
+        if (propertyField != null) {
+        	// Do we have a value to inject ?
+        	Object v = propertyField.getValue();
+        	if (v == null) {
+        		String type = propertyField.getType();
+    	        if ("boolean".equals(type)) { v = Boolean.FALSE; }
+    	        else if ("byte".equals(type)) { v = new Byte((byte) 0); }
+    	        else if ("short".equals(type)) { v = new Short((short) 0); }
+    	        else if ("int".equals(type)) { v = new Integer(0); }
+    	        else if ("long".equals(type)) { v = new Long(0); }
+    	        else if ("float".equals(type)) { v = new Float(0); }
+    	        else if ("double".equals(type)) { v =new Double(0); }
+    	        else if ("char".equals(type)) { v = new Character((char) 0); }
+
+    	        return v;
+    	    }
+            m_instanceManager.onSet(pojo, fieldName, propertyField.getValue());
+            return propertyField.getValue();
+        }
+        return value;
+    }
+
+    /**
+     * Gets the type from a field name.
+     *
+     * @param fieldRequire the name of the required field
+     * @param manipulation the metadata extracted from metadata.xml file
+     * @return the type of the field or {@code null} if it wasn't found
+     */
+    private static String getTypeFromAttributeField(String fieldRequire,
+            PojoMetadata manipulation) {
+
+        FieldMetadata field = manipulation.getField(fieldRequire);
+        if (field == null) {
+            return null;
+        } else {
+            return FieldMetadata.getReflectionType(field.getFieldType());
+        }
+    }
+
+    /**
+     * Gets all the methods available which get this name.
+     *
+     * @param methodName the name of the required methods
+     * @param manipulation the metadata extract from metadata.xml file
+     * @param description the description which appears in JMX console
+     * @return the array of methods with the right name
+     */
+    private MethodField[] getMethodsFromName(String methodName,
+            PojoMetadata manipulation, String description) {
+
+        MethodMetadata[] methods = manipulation.getMethods(methodName);
+        if (methods.length == 0) {
+            return null;
+        }
+
+        MethodField[] ret = new MethodField[methods.length];
+
+        if (methods.length == 1) {
+            ret[0] = new MethodField(methods[0], description);
+            return ret;
+        } else {
+            for (int i = 0; i < methods.length; i++) {
+                ret[i] = new MethodField(methods[i], description);
+            }
+            return ret;
+        }
+    }
+
+    /**
+     * Gets the JMX handler description.
+     *
+     * @return the JMX handler description.
+     * @see org.apache.felix.ipojo.Handler#getDescription()
+     */
+    public HandlerDescription getDescription() {
+        return new JMXHandlerDescription(this);
+    }
+
+    /**
+     * Returns the objectName used to register the MBean. If the MBean is not registered, return an empty string.
+     *
+     * @return the objectName used to register the MBean.
+     * @see org.apache.felix.ipojo.Handler#getDescription()
+     */
+    public String getUsedObjectName() {
+        if (m_objectName != null) {
+            return m_objectName.toString();
+        } else {
+            return "";
+        }
+    }
+
+    /**
+     * Returns true if the MBean is registered.
+     *
+     * @return true if the MBean is registered.
+     */
+    public boolean isRegistered() {
+        return m_registered;
+    }
+
+    /**
+     * Returns true if the MBean must be registered thanks to white board pattern of MOSGi.
+     *
+     * @return {@code true} if the MBean must be registered thanks to white board pattern of MOSGi, false otherwise.
+     */
+    public boolean isUsesMOSGi() {
+        return m_usesMOSGi;
+    }
+
+    /**
+     * Returns true if the MOSGi framework is present on the OSGi platform.
+     *
+     * @return {@code true} if the MOSGi framework is present on the OSGi platform, false otherwise.
+     */
+    public boolean isMOSGiExists() {
+        for (Bundle bundle : m_instanceManager.getContext().getBundles()) {
+            String symbolicName = bundle.getSymbolicName();
+            if ("org.apache.felix.mosgi.jmx.agent".equals(symbolicName)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
diff --git a/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/MethodField.java b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/MethodField.java
new file mode 100644
index 0000000..6ef5b47
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/MethodField.java
@@ -0,0 +1,101 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.handlers.jmx;
+
+import javax.management.MBeanParameterInfo;
+
+import org.apache.felix.ipojo.parser.MethodMetadata;
+
+/**
+ * This class builds a method JMX description.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class MethodField {
+
+    /**
+     * Stores the method description.
+     */
+    private String m_description;
+    /**
+     * Stores the method properties.
+     */
+    private MethodMetadata m_method;
+
+    /**
+     * Constructor.
+     * 
+     * @param method the method properties
+     * @param description the method description
+     */
+    public MethodField(MethodMetadata method, String description) {
+        this.m_method = method;
+        this.m_description = description;
+
+    }
+
+    /**
+     * Gets the method.
+     * @return the method
+     */
+    public MethodMetadata getMethod() {
+        return m_method;
+    }
+
+    /**
+     * Gets the description.
+     * @return the description
+     */
+    public String getDescription() {
+        return m_description;
+    }
+
+    /**
+     * Gets the name.
+     * @return the name
+     */
+    public String getName() {
+        return m_method.getMethodName();
+    }
+
+    /**
+     * Gets the parameter in JMX format.
+     * 
+     * @return info on JMX format
+     */
+    public MBeanParameterInfo[] getParams() {
+        MBeanParameterInfo[] mbean = new MBeanParameterInfo[m_method
+            .getMethodArguments().length];
+        for (int i = 0; i < m_method.getMethodArguments().length; i++) {
+            mbean[i] = new MBeanParameterInfo("arg" + i, m_method
+                .getMethodArguments()[i], null);
+        }
+        return mbean;
+    }
+
+    public String[] getSignature() {
+        return m_method.getMethodArguments();
+    }
+
+    public String getReturnType() {
+        return m_method.getMethodReturn();
+    }
+
+}
diff --git a/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/NotificationField.java b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/NotificationField.java
new file mode 100644
index 0000000..ac541c4
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/NotificationField.java
@@ -0,0 +1,69 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.handlers.jmx;
+
+import javax.management.MBeanNotificationInfo;
+
+/**
+ * This class builds the notification description structure.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class NotificationField {
+    /**
+     * The name of the notification.
+     */
+    private String m_name;
+    /**
+     * The description of the notification.
+     */
+    private String m_description;
+    /**
+     * The field of the notification.
+     */
+    private String m_field;
+
+    /**
+     * Constructor.
+     * 
+     * @param name the name of the notification
+     * @param field the field which send a notification when it is modified
+     * @param description the description which appears in JMX console
+     */
+
+    public NotificationField(String name, String field, String description) {
+        this.m_name = name;
+        this.m_field = field;
+        this.m_description = description;
+    }
+
+    /**
+     * Returns the MBeanNotificationInfo from this class.
+     * 
+     * @return the type of the field or {@code null} if it wasn't found
+     */
+    public MBeanNotificationInfo getNotificationInfo() {
+        String[] notificationTypes = new String[1];
+        notificationTypes[0] = m_field;
+        MBeanNotificationInfo mbni = new MBeanNotificationInfo(
+            notificationTypes, m_name, m_description);
+        return mbni;
+    }
+}
diff --git a/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/PropertyField.java b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/PropertyField.java
new file mode 100644
index 0000000..f7abc8a
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/PropertyField.java
@@ -0,0 +1,196 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.handlers.jmx;
+
+/**
+ * This class build the notification description structure.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class PropertyField {
+
+    /**
+     * The name of the notification.
+     */
+    private String m_name;
+    /**
+     *  The name of the notification.
+     */
+    private String m_field;
+    /**
+     * The name of the notification.
+     */
+    private String m_rights;
+    /**
+     * The name of the notification.
+     */
+    private String m_type;
+    /**
+     * The name of the notification.
+     */
+    private Object m_value;
+    /**
+     * The name of the notification.
+     */
+    private boolean m_notification;
+
+    /**
+     * Constructor.
+     *
+     * @param name the name of the properety
+     * @param field the field which send a notification when it is modified
+     * @param rights the rights of the attribute (ie: 'r' or 'w')
+     * @param type the type of the attribute
+     */
+    public PropertyField(String name, String field, String rights, String type) {
+        this.setName(name);
+        this.setField(field);
+        this.m_type = type;
+        if (isRightsValid(rights)) {
+            this.setRights(rights);
+        } else {
+            this.setField("r"); // default rights is read only
+        }
+    }
+
+    /**
+     * Returns the field.
+     * @return the field
+     */
+    public String getField() {
+        return m_field;
+    }
+
+    /**
+     * Modifies the field.
+     * @param field the new field
+     */
+    public void setField(String field) {
+        this.m_field = field;
+    }
+
+    /**
+     * Returns the name.
+     * @return the name
+     */
+    public String getName() {
+        return m_name;
+    }
+
+    /**
+     * Modifies the name.
+     * @param name the new name
+     */
+    public void setName(String name) {
+        this.m_name = name;
+    }
+
+    /**
+     * Returns the rights.
+     * @return the rights
+     */
+    public String getRights() {
+        return m_rights;
+    }
+
+    /**
+     * Modifies the rights.
+     * @param rights the new rights
+     */
+    public void setRights(String rights) {
+        this.m_rights = rights;
+    }
+
+    /**
+     * Returns the value.
+     * @return the value
+     */
+    public Object getValue() {
+        return m_value;
+    }
+
+    /**
+     * Modifies the value.
+     * @param value the new value
+     */
+    public void setValue(Object value) {
+        this.m_value = value;
+    }
+
+    /**
+     * Returns the type.
+     * @return the type
+     */
+    public String getType() {
+        return this.m_type;
+    }
+
+    /**
+     * Returns the description.
+     * @return the description
+     */
+    public String getDescription() {
+        //TODO Implement this method.
+        return null;
+    }
+
+    /**
+     * Returns true if this property field is readable, false otherwise.
+     * @return {@code true} if this property field is readable, {@code false} otherwise.
+     */
+    public boolean isReadable() {
+        return this.getRights().equals("r") || this.getRights().equals("w");
+    }
+
+    /**
+     * Returns true if this property field is writable, false otherwise.
+     * @return {@code true} if this property field is writable, {@code false} otherwise.
+     */
+    public boolean isWritable() {
+        return this.getRights().equals("w");
+    }
+
+    /**
+     * Returns true if this property field is notifiable, false otherwise.
+     * @return {@code true} if this property field is notifiable, {@code false} otherwise.
+     */
+    public boolean isNotifiable() {
+        return this.m_notification;
+    }
+
+    /**
+     * Modify the notifiability of this property field.
+     * @param value the new notifiability of this property field.
+     */
+    public void setNotifiable(boolean value) {
+        this.m_notification = value;
+    }
+
+    /**
+     * Is the rights is valid or not ? (ie = 'r' || 'w').
+     *
+     * @param rights string representing the rights
+     * @return boolean : return {@code true} if rights = 'r' or 'w'
+     */
+    public static boolean isRightsValid(String rights) {
+        return rights != null && (rights.equals("r") || rights.equals("w"));
+    }
+
+}
diff --git a/ipojo/handler/jmx/jmx-handler/src/main/resources/jmx.xsd b/ipojo/handler/jmx/jmx-handler/src/main/resources/jmx.xsd
new file mode 100644
index 0000000..80152e9
--- /dev/null
+++ b/ipojo/handler/jmx/jmx-handler/src/main/resources/jmx.xsd
@@ -0,0 +1,177 @@
+<!--
+	Licensed to the Apache Software Foundation (ASF) under one
+	or more contributor license agreements.  See the NOTICE file
+	distributed with this work for additional information
+	regarding copyright ownership.  The ASF licenses this file
+	to you under the Apache License, Version 2.0 (the
+	"License"); you may not use this file except in compliance
+	with the License.  You may obtain a copy of the License at
+	
+	http://www.apache.org/licenses/LICENSE-2.0
+	
+	Unless required by applicable law or agreed to in writing,
+	software distributed under the License is distributed on an
+	"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+	KIND, either express or implied.  See the License for the
+	specific language governing permissions and limitations
+	under the License.
+-->
+<xs:schema targetNamespace="org.apache.felix.ipojo.handlers.jmx"
+	xmlns="org.apache.felix.ipojo.handlers.jmx"
+	xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	elementFormDefault="qualified">
+	<xs:element name="config" type="JMXType"></xs:element>
+
+	<xs:complexType name="JMXType">
+
+		<xs:annotation>
+			<xs:documentation>
+				Description of a JMX managed component.
+			</xs:documentation>
+		</xs:annotation>
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element name="method" type="JMXMethod">
+				<xs:annotation>
+					<xs:documentation>
+						The list of methods to expose.
+					</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="property" type="JMXProperty">
+				<xs:annotation>
+					<xs:documentation>
+						The list of attributes to expose.
+					</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+		</xs:choice>
+		<xs:attribute name="usesMOSGi" type="xs:boolean"
+			use="optional">
+			<xs:annotation>
+				<xs:documentation>
+					Determines if the component must be register on the
+					MOSGi MBean server or not.
+				</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="objectName" type="xs:string"
+			use="optional">
+			<xs:annotation>
+				<xs:documentation>
+					The complete object name of the managed component.
+					The syntax of this attribute must be compliant with
+					the ObjectName syntax, detailed in the JMX
+					specification. If neither domain nor name attributes
+					are specified, the default value is determined by
+					the package, the type and the instance name of the
+					component. This attribute overrides the domain and
+					name attributes.
+				</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="domain" type="xs:string" use="optional">
+			<xs:annotation>
+				<xs:documentation>
+					The domain of the managed object (i.e., the left
+					part of the object name). This attribute must be
+					compliant with the domain syntax, as described in
+					the JMX specification.
+				</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="name" type="xs:string" use="optional">
+			<xs:annotation>
+				<xs:documentation>
+					The name property of the managed object. The value
+					of this attribute must comply with the ObjectName
+					value syntax, as described in the JMX specification.
+				</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+
+		<xs:attribute name="preRegister" type="xs:string"
+			use="optional">
+			<xs:annotation>
+				<xs:documentation>
+					Specifies method to carry out operations before
+					beeing registered from the MBean server. The
+					signature of the specified method must be :
+					"ObjectName preRegister(MBeanServer server,
+					ObjectName name) throws Exception".
+				</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="postRegister" type="xs:string"
+			use="optional">
+			<xs:annotation>
+				<xs:documentation>
+					Specifies method to carry out operations after
+					beeing registered from the MBean server. The
+					signature of the specified method must be : "void
+					postRegister(Boolean registrationDone)".
+				</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="preDeregister" type="xs:string"
+			use="optional">
+			<xs:annotation>
+				<xs:documentation>
+					Specifies method to carry out operations before
+					beeing unregistered from the MBean server. The
+					signature of the specified method must be : "void
+					preDeregister() throws Exception".
+				</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="postDeregister" type="xs:string" use="optional">
+			<xs:annotation>
+				<xs:documentation>
+					Specifies method to carry out operations after
+					beeing unregistered from the MBean server. The
+					signature of the specified method must be : 
+					"void postDeregister()".</xs:documentation>
+			</xs:annotation></xs:attribute>
+	</xs:complexType>
+
+	<xs:complexType name="JMXProperty">
+        <xs:annotation>
+        	<xs:documentation>Description of an attribute to expose.</xs:documentation>
+        </xs:annotation>
+        <xs:attribute name="field" type="xs:string" use="required">
+        	<xs:annotation>
+        		<xs:documentation>The name of the component's field to expose.</xs:documentation></xs:annotation></xs:attribute>
+		<xs:attribute name="name" type="xs:string" use="optional">
+			<xs:annotation>
+				<xs:documentation>The name of the property as it will appear in JMX. If unspecified, the default value is the name of the exposed field.</xs:documentation></xs:annotation></xs:attribute>
+		<xs:attribute name="rights" use="optional">
+            <xs:annotation>
+            	<xs:documentation>Specify the access permission of the exposed field.</xs:documentation>
+            </xs:annotation>
+            <xs:simpleType>
+                <xs:annotation>
+                	<xs:documentation>Access permission of an exposed field. Accepted values are "r" (read-only access, the default value) and "w" (read and write access).</xs:documentation>
+                </xs:annotation>
+                <xs:restriction base="xs:string">
+					<xs:enumeration value="r"></xs:enumeration>
+					<xs:enumeration value="w"></xs:enumeration>
+				</xs:restriction>
+			</xs:simpleType>
+		</xs:attribute>
+		<xs:attribute name="notification" type="xs:boolean" use="optional">
+			<xs:annotation>
+				<xs:documentation>Enable or disable attribute change notification sending for this property. If set to &quot;true&quot;, a notification is sent each time the value of the field changes.</xs:documentation></xs:annotation></xs:attribute>
+	</xs:complexType>
+
+	<xs:complexType name="JMXMethod">
+        <xs:annotation>
+        	<xs:documentation>Description of a method to expose.</xs:documentation>
+        </xs:annotation>
+        <xs:attribute name="name" type="xs:string" use="required">
+        	<xs:annotation>
+        		<xs:documentation>The name of the method to expose. If multiple methods have the same name, all of them are exposed.</xs:documentation>
+        	</xs:annotation></xs:attribute>
+		<xs:attribute name="description" type="xs:string" use="optional">
+			<xs:annotation>
+				<xs:documentation>The description of the exposed method, as it will appear in JMX.</xs:documentation></xs:annotation></xs:attribute>
+	</xs:complexType>
+</xs:schema>
\ No newline at end of file